{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 1 商品信息"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>ISBN</th>\n",
       "      <th>Book-Title</th>\n",
       "      <th>Book-Author</th>\n",
       "      <th>Year-Of-Publication</th>\n",
       "      <th>Publisher</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0195153448</td>\n",
       "      <td>Classical Mythology</td>\n",
       "      <td>Mark P. O. Morford</td>\n",
       "      <td>2002</td>\n",
       "      <td>Oxford University Press</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0002005018</td>\n",
       "      <td>Clara Callan</td>\n",
       "      <td>Richard Bruce Wright</td>\n",
       "      <td>2001</td>\n",
       "      <td>HarperFlamingo Canada</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0060973129</td>\n",
       "      <td>Decision in Normandy</td>\n",
       "      <td>Carlo D'Este</td>\n",
       "      <td>1991</td>\n",
       "      <td>HarperPerennial</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0374157065</td>\n",
       "      <td>Flu: The Story of the Great Influenza Pandemic...</td>\n",
       "      <td>Gina Bari Kolata</td>\n",
       "      <td>1999</td>\n",
       "      <td>Farrar Straus Giroux</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0393045218</td>\n",
       "      <td>The Mummies of Urumchi</td>\n",
       "      <td>E. J. W. Barber</td>\n",
       "      <td>1999</td>\n",
       "      <td>W. W. Norton ,Company</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "         ISBN                                         Book-Title  \\\n",
       "0  0195153448                                Classical Mythology   \n",
       "1  0002005018                                       Clara Callan   \n",
       "2  0060973129                               Decision in Normandy   \n",
       "3  0374157065  Flu: The Story of the Great Influenza Pandemic...   \n",
       "4  0393045218                             The Mummies of Urumchi   \n",
       "\n",
       "            Book-Author  Year-Of-Publication                Publisher  \n",
       "0    Mark P. O. Morford                 2002  Oxford University Press  \n",
       "1  Richard Bruce Wright                 2001    HarperFlamingo Canada  \n",
       "2          Carlo D'Este                 1991          HarperPerennial  \n",
       "3      Gina Bari Kolata                 1999     Farrar Straus Giroux  \n",
       "4       E. J. W. Barber                 1999    W. W. Norton ,Company  "
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_book = pd.read_csv('./data/BX-Books.csv',sep=';',usecols = [0,1,2,3,4])\n",
    "df_book.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 2 用户信息"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 读取数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>User-ID</th>\n",
       "      <th>Location</th>\n",
       "      <th>Age</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>nyc, new york, usa</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>stockton, california, usa</td>\n",
       "      <td>18.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>moscow, yukon territory, russia</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>porto, v.n.gaia, portugal</td>\n",
       "      <td>17.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>farnborough, hants, united kingdom</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   User-ID                            Location   Age\n",
       "0        1                  nyc, new york, usa   NaN\n",
       "1        2           stockton, california, usa  18.0\n",
       "2        3     moscow, yukon territory, russia   NaN\n",
       "3        4           porto, v.n.gaia, portugal  17.0\n",
       "4        5  farnborough, hants, united kingdom   NaN"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_user = pd.read_csv('./data/BX-Users.csv',sep=';')\n",
    "df_user.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 修改列名"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>nyc, new york, usa</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>stockton, california, usa</td>\n",
       "      <td>18.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>moscow, yukon territory, russia</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>porto, v.n.gaia, portugal</td>\n",
       "      <td>17.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>farnborough, hants, united kingdom</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id                            location   age\n",
       "0        1                  nyc, new york, usa   NaN\n",
       "1        2           stockton, california, usa  18.0\n",
       "2        3     moscow, yukon territory, russia   NaN\n",
       "3        4           porto, v.n.gaia, portugal  17.0\n",
       "4        5  farnborough, hants, united kingdom   NaN"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_user.columns = ['user_id','location','age']\n",
    "df_user.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 用国家划分location"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "df_user['location'] = df_user['location'].apply(lambda location:location.rsplit(',',maxsplit=1)[-1].strip())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "location_value_counts = df_user['location'].value_counts()\n",
    "\n",
    "# 饼图\n",
    "plt.pie(\n",
    "    location_value_counts,\n",
    "    labels = location_value_counts.index\n",
    ")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['usa',\n",
       " 'canada',\n",
       " 'united kingdom',\n",
       " 'germany',\n",
       " 'spain',\n",
       " 'australia',\n",
       " 'italy',\n",
       " '',\n",
       " 'france',\n",
       " 'portugal',\n",
       " 'new zealand',\n",
       " 'netherlands',\n",
       " 'switzerland']"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_user['location'].value_counts()[:13].index.tolist()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 第5位地址为空，应该是用户没有输入，手动去掉\n",
    "top12_location = ['usa',\n",
    " 'canada',\n",
    " 'united kingdom',\n",
    " 'germany',\n",
    " 'spain',\n",
    " 'australia',\n",
    " 'italy',\n",
    " 'france',\n",
    " 'portugal',\n",
    " 'new zealand',\n",
    " 'netherlands',\n",
    " 'switzerland']\n",
    "\n",
    "df_user['location'] = df_user['location'].apply(lambda location : location if location in top12_location else 'other')\n",
    "\n",
    "location_value_counts = df_user['location'].value_counts()\n",
    "\n",
    "# 饼图\n",
    "plt.pie(\n",
    "    location_value_counts,\n",
    "    labels = location_value_counts.index\n",
    ")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 分析年龄 划分年龄段 "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 278858 entries, 0 to 278857\n",
      "Data columns (total 3 columns):\n",
      " #   Column    Non-Null Count   Dtype  \n",
      "---  ------    --------------   -----  \n",
      " 0   user_id   278858 non-null  int64  \n",
      " 1   location  278858 non-null  object \n",
      " 2   age       168096 non-null  float64\n",
      "dtypes: float64(1), int64(1), object(1)\n",
      "memory usage: 6.4+ MB\n"
     ]
    }
   ],
   "source": [
    "df_user.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "df_user_age_notnull = df_user[~df_user['age'].isnull()]\n",
    "\n",
    "# .value_count() 返回一个统计值出现个数的Serial, 其中.index为原column的值，列数据为个数\n",
    "# .sort_index()  按index排序，这里是按年龄排序\n",
    "df_user_age_notnull = df_user[~df_user['age'].isnull()]\n",
    "\n",
    "age_value_counts_sort_by_age = df_user_age_notnull['age'].value_counts().sort_index() \n",
    "\n",
    "plt.plot(\n",
    "    age_value_counts_sort_by_age.index,\n",
    "    age_value_counts_sort_by_age\n",
    ")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "def divide_age(age):\n",
    "    \"\"\"\n",
    "    :return:\n",
    "        Nan,0-6,>100  --> 0 年龄填写有误\n",
    "        7 - 12        --> 1 少儿\n",
    "        13 - 17       --> 2 青少年\n",
    "        18 - 45       --> 3 青年\n",
    "        46 - 69       --> 4 中年\n",
    "        70 - 100      --> 5 老年\n",
    "    \"\"\"\n",
    "    if np.isnan(age) or (age <= 6) or (age > 100):\n",
    "        return 0\n",
    "    if age >= 7 and age <= 12:\n",
    "        return 1\n",
    "    if age >= 13 and age <= 17:\n",
    "        return 2\n",
    "    if age >= 18 and age <= 45:\n",
    "        return 3\n",
    "    if age >= 46 and age <= 69:\n",
    "        return 4\n",
    "    if age >= 70 and age <= 100:\n",
    "        return 5\n",
    "    \n",
    "df_user['age'] = df_user['age'].apply(divide_age).astype(int)\n",
    "\n",
    "plt.pie(\n",
    "    df_user['age'].value_counts().sort_index(),\n",
    "    labels = ['Undefined','Child','Teenage','Youth','Mid-aged','Elderly']\n",
    ")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 分析年龄段"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 分析打分表"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 读取数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>User-ID</th>\n",
       "      <th>ISBN</th>\n",
       "      <th>Book-Rating</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>276725</td>\n",
       "      <td>034545104X</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>276726</td>\n",
       "      <td>0155061224</td>\n",
       "      <td>5.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>276727</td>\n",
       "      <td>0446520802</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>276729</td>\n",
       "      <td>052165615X</td>\n",
       "      <td>3.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>276729</td>\n",
       "      <td>0521795028</td>\n",
       "      <td>6.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   User-ID        ISBN  Book-Rating\n",
       "0   276725  034545104X          0.0\n",
       "1   276726  0155061224          5.0\n",
       "2   276727  0446520802          0.0\n",
       "3   276729  052165615X          3.0\n",
       "4   276729  0521795028          6.0"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_rating = pd.read_csv('./data/BX-Book-Ratings.csv',sep=';')\n",
    "df_rating.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>item_id</th>\n",
       "      <th>rating</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>276725</td>\n",
       "      <td>034545104X</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>276726</td>\n",
       "      <td>0155061224</td>\n",
       "      <td>5.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>276727</td>\n",
       "      <td>0446520802</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>276729</td>\n",
       "      <td>052165615X</td>\n",
       "      <td>3.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>276729</td>\n",
       "      <td>0521795028</td>\n",
       "      <td>6.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id     item_id  rating\n",
       "0   276725  034545104X     0.0\n",
       "1   276726  0155061224     5.0\n",
       "2   276727  0446520802     0.0\n",
       "3   276729  052165615X     3.0\n",
       "4   276729  0521795028     6.0"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_rating.columns = ['user_id','item_id','rating']\n",
    "df_rating.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 1149780 entries, 0 to 1149779\n",
      "Data columns (total 3 columns):\n",
      " #   Column   Non-Null Count    Dtype  \n",
      "---  ------   --------------    -----  \n",
      " 0   user_id  1149780 non-null  int64  \n",
      " 1   item_id  1149780 non-null  object \n",
      " 2   rating   1149772 non-null  float64\n",
      "dtypes: float64(1), int64(1), object(1)\n",
      "memory usage: 26.3+ MB\n"
     ]
    }
   ],
   "source": [
    "df_rating.info()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 删除有误数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "Int64Index: 1149772 entries, 0 to 1149779\n",
      "Data columns (total 3 columns):\n",
      " #   Column   Non-Null Count    Dtype  \n",
      "---  ------   --------------    -----  \n",
      " 0   user_id  1149772 non-null  int64  \n",
      " 1   item_id  1149772 non-null  object \n",
      " 2   rating   1149772 non-null  float64\n",
      "dtypes: float64(1), int64(1), object(1)\n",
      "memory usage: 35.1+ MB\n"
     ]
    }
   ],
   "source": [
    "# df.dropna() 删除NaN数据\n",
    "df_rating = df_rating.dropna()\n",
    "df_rating.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "Int64Index: 1149772 entries, 0 to 1149779\n",
      "Data columns (total 3 columns):\n",
      " #   Column   Non-Null Count    Dtype \n",
      "---  ------   --------------    ----- \n",
      " 0   user_id  1149772 non-null  int64 \n",
      " 1   item_id  1149772 non-null  object\n",
      " 2   rating   1149772 non-null  int32 \n",
      "dtypes: int32(1), int64(1), object(1)\n",
      "memory usage: 30.7+ MB\n"
     ]
    }
   ],
   "source": [
    "# 将 'rating'列的类型转换为int类型\n",
    "df_rating['rating'] = df_rating['rating'].astype(int)\n",
    "df_rating.info()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 合并用户表与打分表"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>usa</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>usa</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>other</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>portugal</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>united kingdom</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id        location  age\n",
       "0        1             usa    0\n",
       "1        2             usa    3\n",
       "2        3           other    0\n",
       "3        4        portugal    2\n",
       "4        5  united kingdom    0"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_user.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>item_id</th>\n",
       "      <th>rating</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>276725</td>\n",
       "      <td>034545104X</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>276726</td>\n",
       "      <td>0155061224</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>276727</td>\n",
       "      <td>0446520802</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>276729</td>\n",
       "      <td>052165615X</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>276729</td>\n",
       "      <td>0521795028</td>\n",
       "      <td>6</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id     item_id  rating\n",
       "0   276725  034545104X       0\n",
       "1   276726  0155061224       5\n",
       "2   276727  0446520802       0\n",
       "3   276729  052165615X       3\n",
       "4   276729  0521795028       6"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_rating.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "      <th>item_id</th>\n",
       "      <th>rating</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2</td>\n",
       "      <td>usa</td>\n",
       "      <td>3</td>\n",
       "      <td>0195153448</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>7</td>\n",
       "      <td>usa</td>\n",
       "      <td>0</td>\n",
       "      <td>034542252</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>8</td>\n",
       "      <td>canada</td>\n",
       "      <td>0</td>\n",
       "      <td>0002005018</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>8</td>\n",
       "      <td>canada</td>\n",
       "      <td>0</td>\n",
       "      <td>0060973129</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>8</td>\n",
       "      <td>canada</td>\n",
       "      <td>0</td>\n",
       "      <td>0374157065</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id location  age     item_id  rating\n",
       "0        2      usa    3  0195153448       0\n",
       "1        7      usa    0   034542252       0\n",
       "2        8   canada    0  0002005018       5\n",
       "3        8   canada    0  0060973129       0\n",
       "4        8   canada    0  0374157065       0"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# pd.merge()函数中的how='inner'方法：只合并两者中出现同一个‘user_id’(on参数)的项目\n",
    "# 即 如果'user_id' = 2 的用户只出现在表一，但是没有出现在表二（没有对商品打过分），则在合并表单中不产生任何记录。\n",
    "\n",
    "df_data = pd.merge(\n",
    "    df_user,\n",
    "    df_rating,\n",
    "    on='user_id',\n",
    "    how='inner',  # 只合并两者中出现同一个‘user_id’的项目\n",
    ")\n",
    "df_data.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 保存用户打分表"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [],
   "source": [
    "import _pickle as cPickle"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 将表单保存在本地文件\n",
    "cPickle.dump(\n",
    "    df_data,\n",
    "    open('./data/df_data.pkl','wb')\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 分割测试集和训练集"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 从本地数据导入用户打分表"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "      <th>item_id</th>\n",
       "      <th>rating</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2</td>\n",
       "      <td>usa</td>\n",
       "      <td>3</td>\n",
       "      <td>0195153448</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>7</td>\n",
       "      <td>usa</td>\n",
       "      <td>0</td>\n",
       "      <td>034542252</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>8</td>\n",
       "      <td>canada</td>\n",
       "      <td>0</td>\n",
       "      <td>0002005018</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>8</td>\n",
       "      <td>canada</td>\n",
       "      <td>0</td>\n",
       "      <td>0060973129</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>8</td>\n",
       "      <td>canada</td>\n",
       "      <td>0</td>\n",
       "      <td>0374157065</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id location  age     item_id  rating\n",
       "0        2      usa    3  0195153448       0\n",
       "1        7      usa    0   034542252       0\n",
       "2        8   canada    0  0002005018       5\n",
       "3        8   canada    0  0060973129       0\n",
       "4        8   canada    0  0374157065       0"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 将pickle文件导入成dataframe\n",
    "df_data = cPickle.load(\n",
    "    open('./data/df_data.pkl','rb')\n",
    ")\n",
    "df_data.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 划分数据集 70%训练集 30%测试集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "Testing dataset...\n",
      "<class 'pandas.core.frame.DataFrame'>\n",
      "Int64Index: 344931 entries, 109814 to 473426\n",
      "Data columns (total 5 columns):\n",
      " #   Column    Non-Null Count   Dtype \n",
      "---  ------    --------------   ----- \n",
      " 0   user_id   344931 non-null  int64 \n",
      " 1   location  344931 non-null  object\n",
      " 2   age       344931 non-null  int32 \n",
      " 3   item_id   344931 non-null  object\n",
      " 4   rating    344931 non-null  int32 \n",
      "dtypes: int32(2), int64(1), object(2)\n",
      "memory usage: 13.2+ MB\n",
      "None\n",
      "\n",
      "training dataset...\n",
      "<class 'pandas.core.frame.DataFrame'>\n",
      "Int64Index: 804841 entries, 0 to 1149771\n",
      "Data columns (total 5 columns):\n",
      " #   Column    Non-Null Count   Dtype \n",
      "---  ------    --------------   ----- \n",
      " 0   user_id   804841 non-null  int64 \n",
      " 1   location  804841 non-null  object\n",
      " 2   age       804841 non-null  int32 \n",
      " 3   item_id   804841 non-null  object\n",
      " 4   rating    804841 non-null  int32 \n",
      "dtypes: int32(2), int64(1), object(2)\n",
      "memory usage: 30.7+ MB\n",
      "None\n"
     ]
    }
   ],
   "source": [
    "import random\n",
    "\n",
    "random.seed(123)\n",
    "\n",
    "# 从参数1的列表中随机取出参数2指定的个数\n",
    "# random.sample(list, num)\n",
    "test_index_s = random.sample(\n",
    "    df_data.index.tolist(),\n",
    "    int(len(df_data) * 0.3)\n",
    ")\n",
    "\n",
    "# 按照随机序列抽出30%的数据作为测试集\n",
    "df_data_test = df_data.loc[\n",
    "    test_index_s\n",
    "]\n",
    "\n",
    "# 剩余数据作为训练集\n",
    "df_data_training = df_data.loc[\n",
    "    ~df_data.index.isin(test_index_s)\n",
    "]\n",
    "print(\"\\nTesting dataset...\")\n",
    "print(df_data_test.info())\n",
    "print(\"\\ntraining dataset...\")\n",
    "print(df_data_training.info())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 分别保存训练集和测试集数据到本地文件"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [],
   "source": [
    "cPickle.dump(\n",
    "    df_data_test,open('./data/df_data_test.pkl','wb')\n",
    ")\n",
    "cPickle.dump(\n",
    "    df_data_training,open('./data/df_data_training.pkl','wb')\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 用户冷启动，根据训练集打分表推荐商品"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 导入训练集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [],
   "source": [
    "df_data_training = cPickle.load(open('./data/df_data_training.pkl','rb'))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 推荐列表格式：\n",
    "feature_recommand = {\n",
    "    location1:{\n",
    "        age1:[item1, item2,...], \n",
    "        age2:[item1, item2,...],\n",
    "        ...\n",
    "        },\n",
    "    location2:{\n",
    "        ... \n",
    "        },\n",
    "    ...\n",
    "}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "defaultdict(dict,\n",
       "            {'australia': {0: ['0099771519', '1857022424'],\n",
       "              1: [],\n",
       "              2: [],\n",
       "              3: ['0552998486',\n",
       "               '015602943X',\n",
       "               '0552140295',\n",
       "               '0440220602',\n",
       "               '0446532231',\n",
       "               '0007170866',\n",
       "               '1875989218',\n",
       "               '0099727412',\n",
       "               '0860074382',\n",
       "               '0140008535',\n",
       "               '0385335482',\n",
       "               '0553279556',\n",
       "               '1400034779',\n",
       "               '0743225082',\n",
       "               '0949206318'],\n",
       "              4: ['0091867770'],\n",
       "              5: []},\n",
       "             'canada': {0: ['0140505865',\n",
       "               '0140067477',\n",
       "               '076790592X',\n",
       "               '0553250426',\n",
       "               '0060392452',\n",
       "               '0676974791',\n",
       "               '080410526X',\n",
       "               '1552783081',\n",
       "               '0446350982',\n",
       "               '038079487X',\n",
       "               '0385505833',\n",
       "               '0676972152',\n",
       "               '0786867647',\n",
       "               '0060959037',\n",
       "               '0771099894',\n",
       "               '0812550706',\n",
       "               '0425122123',\n",
       "               '0446667900',\n",
       "               '0671011375',\n",
       "               '1550541129'],\n",
       "              1: [],\n",
       "              2: [],\n",
       "              3: ['0060915544',\n",
       "               '0140042393',\n",
       "               '0552137030',\n",
       "               '0836220889',\n",
       "               '0425105334',\n",
       "               '0836218256',\n",
       "               '0140277439',\n",
       "               '0345338588',\n",
       "               '1853260002',\n",
       "               '0060935464',\n",
       "               '0836218353',\n",
       "               '0671868691',\n",
       "               '0446532231',\n",
       "               '038542017X',\n",
       "               '0440224764',\n",
       "               '0770422578',\n",
       "               '0006485278',\n",
       "               '0451163524',\n",
       "               '0771060548',\n",
       "               '0553287893'],\n",
       "              4: ['0380718839',\n",
       "               '0316666343',\n",
       "               '0345370775',\n",
       "               '0684872153',\n",
       "               '0671758896',\n",
       "               '0676974805',\n",
       "               '0440213525',\n",
       "               '0515111279',\n",
       "               '034540288X',\n",
       "               '0676973094',\n",
       "               '0671027360',\n",
       "               '0684874350'],\n",
       "              5: []},\n",
       "             'france': {0: [],\n",
       "              1: [],\n",
       "              2: [],\n",
       "              3: ['2070370003',\n",
       "               '2070408507',\n",
       "               '2253140872',\n",
       "               '2266084372',\n",
       "               '2877302202',\n",
       "               '22530152730',\n",
       "               '2070744833',\n",
       "               '2253072079',\n",
       "               '2277260029',\n",
       "               '2290302155',\n",
       "               '2070363317',\n",
       "               '2253153265',\n",
       "               '2253144452',\n",
       "               '2264016124',\n",
       "               '2226135022',\n",
       "               '2020306492',\n",
       "               '2253154393',\n",
       "               '2290308285',\n",
       "               '2253150711',\n",
       "               '229030039X'],\n",
       "              4: [],\n",
       "              5: []},\n",
       "             'germany': {0: ['3518366823',\n",
       "               '3423072571',\n",
       "               '3518368540',\n",
       "               '3423203668',\n",
       "               '3426029553',\n",
       "               '3453007867',\n",
       "               '3404148665'],\n",
       "              1: [],\n",
       "              2: [],\n",
       "              3: ['3551551936',\n",
       "               '3551551693',\n",
       "               '3551551677',\n",
       "               '3423071516',\n",
       "               '3518372742',\n",
       "               '3257230478',\n",
       "               '3442727952',\n",
       "               '3442724686',\n",
       "               '3518100734',\n",
       "               '3596215226',\n",
       "               '3150000017',\n",
       "               '3426612704',\n",
       "               '3423205202',\n",
       "               '3499224615',\n",
       "               '3423202947',\n",
       "               '3442442354',\n",
       "               '3453071174',\n",
       "               '3551551685',\n",
       "               '3423204206',\n",
       "               '3518388762'],\n",
       "              4: [],\n",
       "              5: []},\n",
       "             'italy': {0: ['8806142100',\n",
       "               '8826703132',\n",
       "               '884590184X',\n",
       "               '8817131628'],\n",
       "              2: [],\n",
       "              3: ['8845205118',\n",
       "               '8807813823',\n",
       "               '8845915700',\n",
       "               '8817106259',\n",
       "               '8807701510',\n",
       "               '8807816067',\n",
       "               '881786983X',\n",
       "               '0743222229',\n",
       "               '8807817039',\n",
       "               '8807814684',\n",
       "               '8806161741',\n",
       "               '884541096X',\n",
       "               '8845290077',\n",
       "               '8817106100',\n",
       "               '0451164075',\n",
       "               '8807816059',\n",
       "               '8804342838',\n",
       "               '9770390107900'],\n",
       "              4: [],\n",
       "              5: []},\n",
       "             'netherlands': {0: [],\n",
       "              1: [],\n",
       "              2: [],\n",
       "              3: ['1400032717'],\n",
       "              4: [],\n",
       "              5: []},\n",
       "             'new zealand': {0: [],\n",
       "              1: [],\n",
       "              2: [],\n",
       "              3: ['0156027321'],\n",
       "              4: [],\n",
       "              5: []},\n",
       "             'other': {0: ['034536676X',\n",
       "               '8826703132',\n",
       "               '074343627X',\n",
       "               '0446604844',\n",
       "               '0439064872',\n",
       "               '0439139600',\n",
       "               '0553296981',\n",
       "               '0380789019',\n",
       "               '1558743669',\n",
       "               '0553375407',\n",
       "               '0140298479',\n",
       "               '0804111359',\n",
       "               '0316693251',\n",
       "               '0060008024',\n",
       "               '1573229571',\n",
       "               '0688177751',\n",
       "               '0385720106',\n",
       "               '0670892963',\n",
       "               '0446608955',\n",
       "               '0671001795'],\n",
       "              1: [],\n",
       "              2: [],\n",
       "              3: ['0553296981',\n",
       "               '0441001971',\n",
       "               '0590353403',\n",
       "               '0786868716',\n",
       "               '0446310786',\n",
       "               '0439136350',\n",
       "               '0553213148',\n",
       "               '0439139597',\n",
       "               '0345378490',\n",
       "               '0842329218',\n",
       "               '0312924585',\n",
       "               '051513628X',\n",
       "               '0151008116',\n",
       "               '0061092177',\n",
       "               '0099800403',\n",
       "               '0385484518',\n",
       "               '0747546290',\n",
       "               '0140621725',\n",
       "               '0684872153',\n",
       "               '0446670111'],\n",
       "              4: [],\n",
       "              5: []},\n",
       "             'portugal': {0: [],\n",
       "              1: [],\n",
       "              2: [],\n",
       "              3: ['038082101X',\n",
       "               '0439139600',\n",
       "               '0380815923',\n",
       "               '006050918X',\n",
       "               '9505156944',\n",
       "               '0380977788',\n",
       "               '002542730X',\n",
       "               '0460877305',\n",
       "               '0385721234',\n",
       "               '0385413041',\n",
       "               '9726081378',\n",
       "               '0811214982',\n",
       "               '0330262130',\n",
       "               '0880381744',\n",
       "               '0552137030',\n",
       "               '9722113747',\n",
       "               '9580464162',\n",
       "               '9724614565',\n",
       "               '1401201385'],\n",
       "              4: [],\n",
       "              5: []},\n",
       "             'spain': {0: [],\n",
       "              1: [],\n",
       "              2: [],\n",
       "              3: ['8445071416',\n",
       "               '8420616893',\n",
       "               '8420613487',\n",
       "               '950491036X',\n",
       "               '8478886508',\n",
       "               '8478886451',\n",
       "               '0156013924',\n",
       "               '8408039369',\n",
       "               '8420636282',\n",
       "               '8495501074',\n",
       "               '8420432113',\n",
       "               '8440627203',\n",
       "               '8445071408',\n",
       "               '0452282152',\n",
       "               '9681501225',\n",
       "               '8445071769',\n",
       "               '8420466034',\n",
       "               '8445071394',\n",
       "               '8423309223',\n",
       "               '8433914545'],\n",
       "              4: ['8408043641'],\n",
       "              5: []},\n",
       "             'switzerland': {0: [], 2: [], 3: ['3426600218'], 4: []},\n",
       "             'united kingdom': {0: ['0590660543',\n",
       "               '000649840X',\n",
       "               '0330367358',\n",
       "               '0330376519',\n",
       "               '1857027051',\n",
       "               '0749395990',\n",
       "               '0552124753',\n",
       "               '0099771519',\n",
       "               '0749399902'],\n",
       "              1: [],\n",
       "              2: [],\n",
       "              3: ['1844262553',\n",
       "               '0091891965',\n",
       "               '0140620117',\n",
       "               '0330258648',\n",
       "               '1860465811',\n",
       "               '1857231384',\n",
       "               '0552145424',\n",
       "               '0440206154',\n",
       "               '0552131059',\n",
       "               '0192833596',\n",
       "               '0440235596',\n",
       "               '0552142379',\n",
       "               '0330267388',\n",
       "               '0671024337',\n",
       "               '0380002930',\n",
       "               '0722532938',\n",
       "               '0552149519',\n",
       "               '0140287248',\n",
       "               '0380813815',\n",
       "               '0064407667'],\n",
       "              4: ['1844262553', '0552147680', '0552131067', '0552996181'],\n",
       "              5: []},\n",
       "             'usa': {0: ['0156004801',\n",
       "               '0060256672',\n",
       "               '0971942315',\n",
       "               '1576738167',\n",
       "               '0553351397',\n",
       "               '0441002935',\n",
       "               '0615116426',\n",
       "               '0316735027',\n",
       "               '0140309578',\n",
       "               '0140185232',\n",
       "               '0553148001',\n",
       "               '0395977894',\n",
       "               '0743455967',\n",
       "               '0618002235',\n",
       "               '039480029X',\n",
       "               '0877738513',\n",
       "               '0060248025',\n",
       "               '0807083054',\n",
       "               '0553380958',\n",
       "               '0553213504'],\n",
       "              1: ['0064407667', '0439064872', '059035342X'],\n",
       "              2: ['0590353403',\n",
       "               '0440237688',\n",
       "               '0451191137',\n",
       "               '0439139597',\n",
       "               '0679886370',\n",
       "               '0140348107',\n",
       "               '0064472272',\n",
       "               '0439064864',\n",
       "               '0671027344',\n",
       "               '0446608955',\n",
       "               '0394820371',\n",
       "               '0385729332',\n",
       "               '0316666343',\n",
       "               '0385729340',\n",
       "               '0385730586',\n",
       "               '043935806X',\n",
       "               '0439136350',\n",
       "               '1576738159',\n",
       "               '0440439884',\n",
       "               '0345342968'],\n",
       "              3: ['0066238501',\n",
       "               '0517693119',\n",
       "               '0394800389',\n",
       "               '0920668364',\n",
       "               '0395177111',\n",
       "               '0890876789',\n",
       "               '0898159954',\n",
       "               '0316286850',\n",
       "               '0375503803',\n",
       "               '0316779059',\n",
       "               '156402976X',\n",
       "               '0553110845',\n",
       "               '0060256737',\n",
       "               '0060968966',\n",
       "               '0670451932',\n",
       "               '0805013407',\n",
       "               '0060961325',\n",
       "               '0140195831',\n",
       "               '0451525663',\n",
       "               '0451171926'],\n",
       "              4: ['0312303467',\n",
       "               '0060514957',\n",
       "               '0553377868',\n",
       "               '0688167888',\n",
       "               '0399151451',\n",
       "               '1579546463',\n",
       "               '0380977311',\n",
       "               '0553379615',\n",
       "               '0943233828',\n",
       "               '0446532452',\n",
       "               '0553565079',\n",
       "               '0066214769',\n",
       "               '0446322180',\n",
       "               '0439064864',\n",
       "               '0399151613',\n",
       "               '0449911519',\n",
       "               '0451169514',\n",
       "               '0553802461',\n",
       "               '0312983220',\n",
       "               '0312983301'],\n",
       "              5: ['0440234743', '044022165X']}})"
      ]
     },
     "execution_count": 60,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from collections import defaultdict\n",
    "\n",
    "feature_recommand = defaultdict(dict)\n",
    "feature_recommand_with_rating = defaultdict(dict)\n",
    "\n",
    "for location, groupby_location in df_data_training.groupby('location'):\n",
    "    for age, groupby_location_age in groupby_location.groupby('age'):\n",
    "        item_id_value_counts = groupby_location_age['item_id'].value_counts()\n",
    "        selection_line = max(np.percentile(item_id_value_counts, 75),5)\n",
    "        \n",
    "        top25pc_list = item_id_value_counts[item_id_value_counts >= selection_line].index\n",
    "        item_mean_rating = groupby_location_age[groupby_location_age['item_id'].isin(top25pc_list)].groupby('item_id')['rating'].mean().sort_values(ascending = False)[:20]\n",
    "        \n",
    "        feature_recommand[location][age] = [\n",
    "            item_id\n",
    "            for item_id in item_mean_rating.index if item_mean_rating[item_id] >= 5\n",
    "        ]\n",
    "        \n",
    "        feature_recommand_with_rating[location][age] = [\n",
    "            { \"%s\" % item_id: round(item_mean_rating[item_id], 2)}\n",
    "            for item_id in item_mean_rating.index if item_mean_rating[item_id] >= 5\n",
    "        ]\n",
    "        \n",
    "feature_recommand    "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "* 有些人群推荐字典为空，可以将不分区域年龄的数据全集中最热门、评分最高的商品推荐给他们"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 找到热门商品"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {},
   "outputs": [],
   "source": [
    "top2000_item_id_s = df_data_training['item_id'].value_counts()[:2000].index.tolist()\n",
    "\n",
    "df_data_trainning_top2000 = df_data_training[\n",
    "    df_data_training['item_id'].isin(top2000_item_id_s)\n",
    "]\n",
    "\n",
    "top_item_recomm_s = df_data_trainning_top2000.groupby('item_id')['rating'].mean().sort_values(ascending = False)[:20]\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "item_id\n",
       "1844262553    8.000000\n",
       "0439139597    6.721805\n",
       "0439136350    6.553846\n",
       "0439064864    6.547826\n",
       "0877017883    6.188679\n",
       "Name: rating, dtype: float64"
      ]
     },
     "execution_count": 47,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "top_item_recomm_s.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 将上述全局推荐商品填充到每个推荐列表中，如果之前有推荐商品，但个数不足20个的，也进行填充\n",
    "for location in feature_recommand.keys():\n",
    "    for age in feature_recommand[location].keys():\n",
    "        \n",
    "        feature_recommand_len = len(feature_recommand[location][age])  # 原推荐列表的长度\n",
    "        feature_recommand[location][age] += (top_item_recomm_s.index[:20-feature_recommand_len].tolist())  # 填充列表\n",
    "        \n",
    "        #for i in range(20-feature_recommand_len):\n",
    "        #    feature_recommand_with_rating[location][age].append({ \"%s\" % top_item_recomm_s.index[i]: round(top_item_recomm_s.iloc[i], 2)})\n",
    "        feature_recommand_with_rating[location][age] += [{ \"%s\" % top_item_recomm_s.index[i]: round(top_item_recomm_s.iloc[i], 2)} for i in range(20-feature_recommand_len)]\n",
    "        "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "defaultdict(dict,\n",
       "            {'australia': {0: [{'0099771519': 7.0},\n",
       "               {'1857022424': 5.33},\n",
       "               {'1844262553': 8.0},\n",
       "               {'0439139597': 6.72},\n",
       "               {'0439136350': 6.55},\n",
       "               {'0439064864': 6.55},\n",
       "               {'0877017883': 6.19},\n",
       "               {'0618002227': 6.16},\n",
       "               {'0590353403': 6.13},\n",
       "               {'0671027344': 6.07},\n",
       "               {'0385199570': 5.93},\n",
       "               {'0771060548': 5.91},\n",
       "               {'0156528207': 5.78},\n",
       "               {'0618129022': 5.76},\n",
       "               {'0552131059': 5.67},\n",
       "               {'0811801802': 5.65},\n",
       "               {'0670032379': 5.55},\n",
       "               {'0812550706': 5.52},\n",
       "               {'0375756981': 5.51},\n",
       "               {'0670894605': 5.42}],\n",
       "              1: [{'1844262553': 8.0},\n",
       "               {'0439139597': 6.72},\n",
       "               {'0439136350': 6.55},\n",
       "               {'0439064864': 6.55},\n",
       "               {'0877017883': 6.19},\n",
       "               {'0618002227': 6.16},\n",
       "               {'0590353403': 6.13},\n",
       "               {'0671027344': 6.07},\n",
       "               {'0385199570': 5.93},\n",
       "               {'0771060548': 5.91},\n",
       "               {'0156528207': 5.78},\n",
       "               {'0618129022': 5.76},\n",
       "               {'0552131059': 5.67},\n",
       "               {'0811801802': 5.65},\n",
       "               {'0670032379': 5.55},\n",
       "               {'0812550706': 5.52},\n",
       "               {'0375756981': 5.51},\n",
       "               {'0670894605': 5.42},\n",
       "               {'0811825558': 5.36},\n",
       "               {'0439139600': 5.32}],\n",
       "              2: [{'1844262553': 8.0},\n",
       "               {'0439139597': 6.72},\n",
       "               {'0439136350': 6.55},\n",
       "               {'0439064864': 6.55},\n",
       "               {'0877017883': 6.19},\n",
       "               {'0618002227': 6.16},\n",
       "               {'0590353403': 6.13},\n",
       "               {'0671027344': 6.07},\n",
       "               {'0385199570': 5.93},\n",
       "               {'0771060548': 5.91},\n",
       "               {'0156528207': 5.78},\n",
       "               {'0618129022': 5.76},\n",
       "               {'0552131059': 5.67},\n",
       "               {'0811801802': 5.65},\n",
       "               {'0670032379': 5.55},\n",
       "               {'0812550706': 5.52},\n",
       "               {'0375756981': 5.51},\n",
       "               {'0670894605': 5.42},\n",
       "               {'0811825558': 5.36},\n",
       "               {'0439139600': 5.32}],\n",
       "              3: [{'0552998486': 8.8},\n",
       "               {'015602943X': 7.2},\n",
       "               {'0552140295': 6.8},\n",
       "               {'0440220602': 6.6},\n",
       "               {'0446532231': 6.2},\n",
       "               {'0007170866': 6.14},\n",
       "               {'1875989218': 6.09},\n",
       "               {'0099727412': 6.0},\n",
       "               {'0860074382': 5.91},\n",
       "               {'0140008535': 5.86},\n",
       "               {'0385335482': 5.71},\n",
       "               {'0553279556': 5.67},\n",
       "               {'1400034779': 5.4},\n",
       "               {'0743225082': 5.33},\n",
       "               {'0949206318': 5.17},\n",
       "               {'1844262553': 8.0},\n",
       "               {'0439139597': 6.72},\n",
       "               {'0439136350': 6.55},\n",
       "               {'0439064864': 6.55},\n",
       "               {'0877017883': 6.19}],\n",
       "              4: [{'0091867770': 5.17},\n",
       "               {'1844262553': 8.0},\n",
       "               {'0439139597': 6.72},\n",
       "               {'0439136350': 6.55},\n",
       "               {'0439064864': 6.55},\n",
       "               {'0877017883': 6.19},\n",
       "               {'0618002227': 6.16},\n",
       "               {'0590353403': 6.13},\n",
       "               {'0671027344': 6.07},\n",
       "               {'0385199570': 5.93},\n",
       "               {'0771060548': 5.91},\n",
       "               {'0156528207': 5.78},\n",
       "               {'0618129022': 5.76},\n",
       "               {'0552131059': 5.67},\n",
       "               {'0811801802': 5.65},\n",
       "               {'0670032379': 5.55},\n",
       "               {'0812550706': 5.52},\n",
       "               {'0375756981': 5.51},\n",
       "               {'0670894605': 5.42},\n",
       "               {'0811825558': 5.36}],\n",
       "              5: [{'1844262553': 8.0},\n",
       "               {'0439139597': 6.72},\n",
       "               {'0439136350': 6.55},\n",
       "               {'0439064864': 6.55},\n",
       "               {'0877017883': 6.19},\n",
       "               {'0618002227': 6.16},\n",
       "               {'0590353403': 6.13},\n",
       "               {'0671027344': 6.07},\n",
       "               {'0385199570': 5.93},\n",
       "               {'0771060548': 5.91},\n",
       "               {'0156528207': 5.78},\n",
       "               {'0618129022': 5.76},\n",
       "               {'0552131059': 5.67},\n",
       "               {'0811801802': 5.65},\n",
       "               {'0670032379': 5.55},\n",
       "               {'0812550706': 5.52},\n",
       "               {'0375756981': 5.51},\n",
       "               {'0670894605': 5.42},\n",
       "               {'0811825558': 5.36},\n",
       "               {'0439139600': 5.32}]},\n",
       "             'canada': {0: [{'0140505865': 9.4},\n",
       "               {'0140067477': 7.86},\n",
       "               {'076790592X': 7.4},\n",
       "               {'0553250426': 7.12},\n",
       "               {'0060392452': 7.0},\n",
       "               {'0676974791': 6.83},\n",
       "               {'080410526X': 6.8},\n",
       "               {'1552783081': 6.8},\n",
       "               {'0446350982': 6.8},\n",
       "               {'038079487X': 6.6},\n",
       "               {'0385505833': 6.4},\n",
       "               {'0676972152': 6.4},\n",
       "               {'0786867647': 6.4},\n",
       "               {'0060959037': 6.38},\n",
       "               {'0771099894': 6.25},\n",
       "               {'0812550706': 6.2},\n",
       "               {'0425122123': 6.2},\n",
       "               {'0446667900': 6.12},\n",
       "               {'0671011375': 6.0},\n",
       "               {'1550541129': 6.0}],\n",
       "              1: [{'1844262553': 8.0},\n",
       "               {'0439139597': 6.72},\n",
       "               {'0439136350': 6.55},\n",
       "               {'0439064864': 6.55},\n",
       "               {'0877017883': 6.19},\n",
       "               {'0618002227': 6.16},\n",
       "               {'0590353403': 6.13},\n",
       "               {'0671027344': 6.07},\n",
       "               {'0385199570': 5.93},\n",
       "               {'0771060548': 5.91},\n",
       "               {'0156528207': 5.78},\n",
       "               {'0618129022': 5.76},\n",
       "               {'0552131059': 5.67},\n",
       "               {'0811801802': 5.65},\n",
       "               {'0670032379': 5.55},\n",
       "               {'0812550706': 5.52},\n",
       "               {'0375756981': 5.51},\n",
       "               {'0670894605': 5.42},\n",
       "               {'0811825558': 5.36},\n",
       "               {'0439139600': 5.32}],\n",
       "              2: [{'1844262553': 8.0},\n",
       "               {'0439139597': 6.72},\n",
       "               {'0439136350': 6.55},\n",
       "               {'0439064864': 6.55},\n",
       "               {'0877017883': 6.19},\n",
       "               {'0618002227': 6.16},\n",
       "               {'0590353403': 6.13},\n",
       "               {'0671027344': 6.07},\n",
       "               {'0385199570': 5.93},\n",
       "               {'0771060548': 5.91},\n",
       "               {'0156528207': 5.78},\n",
       "               {'0618129022': 5.76},\n",
       "               {'0552131059': 5.67},\n",
       "               {'0811801802': 5.65},\n",
       "               {'0670032379': 5.55},\n",
       "               {'0812550706': 5.52},\n",
       "               {'0375756981': 5.51},\n",
       "               {'0670894605': 5.42},\n",
       "               {'0811825558': 5.36},\n",
       "               {'0439139600': 5.32}],\n",
       "              3: [{'0060915544': 8.43},\n",
       "               {'0140042393': 8.33},\n",
       "               {'0552137030': 8.29},\n",
       "               {'0836220889': 7.83},\n",
       "               {'0425105334': 7.8},\n",
       "               {'0836218256': 7.67},\n",
       "               {'0140277439': 7.6},\n",
       "               {'0345338588': 7.6},\n",
       "               {'1853260002': 7.5},\n",
       "               {'0060935464': 7.4},\n",
       "               {'0836218353': 7.2},\n",
       "               {'0671868691': 7.17},\n",
       "               {'0446532231': 7.15},\n",
       "               {'038542017X': 7.14},\n",
       "               {'0440224764': 7.0},\n",
       "               {'0770422578': 7.0},\n",
       "               {'0006485278': 7.0},\n",
       "               {'0451163524': 7.0},\n",
       "               {'0771060548': 6.89},\n",
       "               {'0553287893': 6.83}],\n",
       "              4: [{'0380718839': 8.4},\n",
       "               {'0316666343': 7.57},\n",
       "               {'0345370775': 7.0},\n",
       "               {'0684872153': 6.6},\n",
       "               {'0671758896': 6.2},\n",
       "               {'0676974805': 6.0},\n",
       "               {'0440213525': 5.57},\n",
       "               {'0515111279': 5.43},\n",
       "               {'034540288X': 5.29},\n",
       "               {'0676973094': 5.22},\n",
       "               {'0671027360': 5.2},\n",
       "               {'0684874350': 5.0},\n",
       "               {'1844262553': 8.0},\n",
       "               {'0439139597': 6.72},\n",
       "               {'0439136350': 6.55},\n",
       "               {'0439064864': 6.55},\n",
       "               {'0877017883': 6.19},\n",
       "               {'0618002227': 6.16},\n",
       "               {'0590353403': 6.13},\n",
       "               {'0671027344': 6.07}],\n",
       "              5: [{'1844262553': 8.0},\n",
       "               {'0439139597': 6.72},\n",
       "               {'0439136350': 6.55},\n",
       "               {'0439064864': 6.55},\n",
       "               {'0877017883': 6.19},\n",
       "               {'0618002227': 6.16},\n",
       "               {'0590353403': 6.13},\n",
       "               {'0671027344': 6.07},\n",
       "               {'0385199570': 5.93},\n",
       "               {'0771060548': 5.91},\n",
       "               {'0156528207': 5.78},\n",
       "               {'0618129022': 5.76},\n",
       "               {'0552131059': 5.67},\n",
       "               {'0811801802': 5.65},\n",
       "               {'0670032379': 5.55},\n",
       "               {'0812550706': 5.52},\n",
       "               {'0375756981': 5.51},\n",
       "               {'0670894605': 5.42},\n",
       "               {'0811825558': 5.36},\n",
       "               {'0439139600': 5.32}]},\n",
       "             'france': {0: [{'1844262553': 8.0},\n",
       "               {'0439139597': 6.72},\n",
       "               {'0439136350': 6.55},\n",
       "               {'0439064864': 6.55},\n",
       "               {'0877017883': 6.19},\n",
       "               {'0618002227': 6.16},\n",
       "               {'0590353403': 6.13},\n",
       "               {'0671027344': 6.07},\n",
       "               {'0385199570': 5.93},\n",
       "               {'0771060548': 5.91},\n",
       "               {'0156528207': 5.78},\n",
       "               {'0618129022': 5.76},\n",
       "               {'0552131059': 5.67},\n",
       "               {'0811801802': 5.65},\n",
       "               {'0670032379': 5.55},\n",
       "               {'0812550706': 5.52},\n",
       "               {'0375756981': 5.51},\n",
       "               {'0670894605': 5.42},\n",
       "               {'0811825558': 5.36},\n",
       "               {'0439139600': 5.32}],\n",
       "              1: [{'1844262553': 8.0},\n",
       "               {'0439139597': 6.72},\n",
       "               {'0439136350': 6.55},\n",
       "               {'0439064864': 6.55},\n",
       "               {'0877017883': 6.19},\n",
       "               {'0618002227': 6.16},\n",
       "               {'0590353403': 6.13},\n",
       "               {'0671027344': 6.07},\n",
       "               {'0385199570': 5.93},\n",
       "               {'0771060548': 5.91},\n",
       "               {'0156528207': 5.78},\n",
       "               {'0618129022': 5.76},\n",
       "               {'0552131059': 5.67},\n",
       "               {'0811801802': 5.65},\n",
       "               {'0670032379': 5.55},\n",
       "               {'0812550706': 5.52},\n",
       "               {'0375756981': 5.51},\n",
       "               {'0670894605': 5.42},\n",
       "               {'0811825558': 5.36},\n",
       "               {'0439139600': 5.32}],\n",
       "              2: [{'1844262553': 8.0},\n",
       "               {'0439139597': 6.72},\n",
       "               {'0439136350': 6.55},\n",
       "               {'0439064864': 6.55},\n",
       "               {'0877017883': 6.19},\n",
       "               {'0618002227': 6.16},\n",
       "               {'0590353403': 6.13},\n",
       "               {'0671027344': 6.07},\n",
       "               {'0385199570': 5.93},\n",
       "               {'0771060548': 5.91},\n",
       "               {'0156528207': 5.78},\n",
       "               {'0618129022': 5.76},\n",
       "               {'0552131059': 5.67},\n",
       "               {'0811801802': 5.65},\n",
       "               {'0670032379': 5.55},\n",
       "               {'0812550706': 5.52},\n",
       "               {'0375756981': 5.51},\n",
       "               {'0670894605': 5.42},\n",
       "               {'0811825558': 5.36},\n",
       "               {'0439139600': 5.32}],\n",
       "              3: [{'2070370003': 9.0},\n",
       "               {'2070408507': 7.33},\n",
       "               {'2253140872': 7.14},\n",
       "               {'2266084372': 7.12},\n",
       "               {'2877302202': 6.8},\n",
       "               {'22530152730': 6.6},\n",
       "               {'2070744833': 6.57},\n",
       "               {'2253072079': 6.4},\n",
       "               {'2277260029': 6.4},\n",
       "               {'2290302155': 6.33},\n",
       "               {'2070363317': 6.2},\n",
       "               {'2253153265': 6.2},\n",
       "               {'2253144452': 6.17},\n",
       "               {'2264016124': 6.17},\n",
       "               {'2226135022': 6.12},\n",
       "               {'2020306492': 6.0},\n",
       "               {'2253154393': 6.0},\n",
       "               {'2290308285': 5.89},\n",
       "               {'2253150711': 5.71},\n",
       "               {'229030039X': 5.6}],\n",
       "              4: [{'1844262553': 8.0},\n",
       "               {'0439139597': 6.72},\n",
       "               {'0439136350': 6.55},\n",
       "               {'0439064864': 6.55},\n",
       "               {'0877017883': 6.19},\n",
       "               {'0618002227': 6.16},\n",
       "               {'0590353403': 6.13},\n",
       "               {'0671027344': 6.07},\n",
       "               {'0385199570': 5.93},\n",
       "               {'0771060548': 5.91},\n",
       "               {'0156528207': 5.78},\n",
       "               {'0618129022': 5.76},\n",
       "               {'0552131059': 5.67},\n",
       "               {'0811801802': 5.65},\n",
       "               {'0670032379': 5.55},\n",
       "               {'0812550706': 5.52},\n",
       "               {'0375756981': 5.51},\n",
       "               {'0670894605': 5.42},\n",
       "               {'0811825558': 5.36},\n",
       "               {'0439139600': 5.32}],\n",
       "              5: [{'1844262553': 8.0},\n",
       "               {'0439139597': 6.72},\n",
       "               {'0439136350': 6.55},\n",
       "               {'0439064864': 6.55},\n",
       "               {'0877017883': 6.19},\n",
       "               {'0618002227': 6.16},\n",
       "               {'0590353403': 6.13},\n",
       "               {'0671027344': 6.07},\n",
       "               {'0385199570': 5.93},\n",
       "               {'0771060548': 5.91},\n",
       "               {'0156528207': 5.78},\n",
       "               {'0618129022': 5.76},\n",
       "               {'0552131059': 5.67},\n",
       "               {'0811801802': 5.65},\n",
       "               {'0670032379': 5.55},\n",
       "               {'0812550706': 5.52},\n",
       "               {'0375756981': 5.51},\n",
       "               {'0670894605': 5.42},\n",
       "               {'0811825558': 5.36},\n",
       "               {'0439139600': 5.32}]},\n",
       "             'germany': {0: [{'3518366823': 6.8},\n",
       "               {'3423072571': 6.2},\n",
       "               {'3518368540': 6.0},\n",
       "               {'3423203668': 5.33},\n",
       "               {'3426029553': 5.25},\n",
       "               {'3453007867': 5.17},\n",
       "               {'3404148665': 5.0},\n",
       "               {'1844262553': 8.0},\n",
       "               {'0439139597': 6.72},\n",
       "               {'0439136350': 6.55},\n",
       "               {'0439064864': 6.55},\n",
       "               {'0877017883': 6.19},\n",
       "               {'0618002227': 6.16},\n",
       "               {'0590353403': 6.13},\n",
       "               {'0671027344': 6.07},\n",
       "               {'0385199570': 5.93},\n",
       "               {'0771060548': 5.91},\n",
       "               {'0156528207': 5.78},\n",
       "               {'0618129022': 5.76},\n",
       "               {'0552131059': 5.67}],\n",
       "              1: [{'1844262553': 8.0},\n",
       "               {'0439139597': 6.72},\n",
       "               {'0439136350': 6.55},\n",
       "               {'0439064864': 6.55},\n",
       "               {'0877017883': 6.19},\n",
       "               {'0618002227': 6.16},\n",
       "               {'0590353403': 6.13},\n",
       "               {'0671027344': 6.07},\n",
       "               {'0385199570': 5.93},\n",
       "               {'0771060548': 5.91},\n",
       "               {'0156528207': 5.78},\n",
       "               {'0618129022': 5.76},\n",
       "               {'0552131059': 5.67},\n",
       "               {'0811801802': 5.65},\n",
       "               {'0670032379': 5.55},\n",
       "               {'0812550706': 5.52},\n",
       "               {'0375756981': 5.51},\n",
       "               {'0670894605': 5.42},\n",
       "               {'0811825558': 5.36},\n",
       "               {'0439139600': 5.32}],\n",
       "              2: [{'1844262553': 8.0},\n",
       "               {'0439139597': 6.72},\n",
       "               {'0439136350': 6.55},\n",
       "               {'0439064864': 6.55},\n",
       "               {'0877017883': 6.19},\n",
       "               {'0618002227': 6.16},\n",
       "               {'0590353403': 6.13},\n",
       "               {'0671027344': 6.07},\n",
       "               {'0385199570': 5.93},\n",
       "               {'0771060548': 5.91},\n",
       "               {'0156528207': 5.78},\n",
       "               {'0618129022': 5.76},\n",
       "               {'0552131059': 5.67},\n",
       "               {'0811801802': 5.65},\n",
       "               {'0670032379': 5.55},\n",
       "               {'0812550706': 5.52},\n",
       "               {'0375756981': 5.51},\n",
       "               {'0670894605': 5.42},\n",
       "               {'0811825558': 5.36},\n",
       "               {'0439139600': 5.32}],\n",
       "              3: [{'3551551936': 9.6},\n",
       "               {'3551551693': 9.5},\n",
       "               {'3551551677': 9.5},\n",
       "               {'3423071516': 9.0},\n",
       "               {'3518372742': 8.0},\n",
       "               {'3257230478': 7.67},\n",
       "               {'3442727952': 7.43},\n",
       "               {'3442724686': 7.33},\n",
       "               {'3518100734': 7.33},\n",
       "               {'3596215226': 7.3},\n",
       "               {'3150000017': 7.14},\n",
       "               {'3426612704': 6.89},\n",
       "               {'3423205202': 6.88},\n",
       "               {'3499224615': 6.71},\n",
       "               {'3423202947': 6.7},\n",
       "               {'3442442354': 6.67},\n",
       "               {'3453071174': 6.6},\n",
       "               {'3551551685': 6.5},\n",
       "               {'3423204206': 6.44},\n",
       "               {'3518388762': 6.4}],\n",
       "              4: [{'1844262553': 8.0},\n",
       "               {'0439139597': 6.72},\n",
       "               {'0439136350': 6.55},\n",
       "               {'0439064864': 6.55},\n",
       "               {'0877017883': 6.19},\n",
       "               {'0618002227': 6.16},\n",
       "               {'0590353403': 6.13},\n",
       "               {'0671027344': 6.07},\n",
       "               {'0385199570': 5.93},\n",
       "               {'0771060548': 5.91},\n",
       "               {'0156528207': 5.78},\n",
       "               {'0618129022': 5.76},\n",
       "               {'0552131059': 5.67},\n",
       "               {'0811801802': 5.65},\n",
       "               {'0670032379': 5.55},\n",
       "               {'0812550706': 5.52},\n",
       "               {'0375756981': 5.51},\n",
       "               {'0670894605': 5.42},\n",
       "               {'0811825558': 5.36},\n",
       "               {'0439139600': 5.32}],\n",
       "              5: [{'1844262553': 8.0},\n",
       "               {'0439139597': 6.72},\n",
       "               {'0439136350': 6.55},\n",
       "               {'0439064864': 6.55},\n",
       "               {'0877017883': 6.19},\n",
       "               {'0618002227': 6.16},\n",
       "               {'0590353403': 6.13},\n",
       "               {'0671027344': 6.07},\n",
       "               {'0385199570': 5.93},\n",
       "               {'0771060548': 5.91},\n",
       "               {'0156528207': 5.78},\n",
       "               {'0618129022': 5.76},\n",
       "               {'0552131059': 5.67},\n",
       "               {'0811801802': 5.65},\n",
       "               {'0670032379': 5.55},\n",
       "               {'0812550706': 5.52},\n",
       "               {'0375756981': 5.51},\n",
       "               {'0670894605': 5.42},\n",
       "               {'0811825558': 5.36},\n",
       "               {'0439139600': 5.32}]},\n",
       "             'italy': {0: [{'8806142100': 6.33},\n",
       "               {'8826703132': 6.08},\n",
       "               {'884590184X': 6.0},\n",
       "               {'8817131628': 5.2},\n",
       "               {'1844262553': 8.0},\n",
       "               {'0439139597': 6.72},\n",
       "               {'0439136350': 6.55},\n",
       "               {'0439064864': 6.55},\n",
       "               {'0877017883': 6.19},\n",
       "               {'0618002227': 6.16},\n",
       "               {'0590353403': 6.13},\n",
       "               {'0671027344': 6.07},\n",
       "               {'0385199570': 5.93},\n",
       "               {'0771060548': 5.91},\n",
       "               {'0156528207': 5.78},\n",
       "               {'0618129022': 5.76},\n",
       "               {'0552131059': 5.67},\n",
       "               {'0811801802': 5.65},\n",
       "               {'0670032379': 5.55},\n",
       "               {'0812550706': 5.52}],\n",
       "              2: [{'1844262553': 8.0},\n",
       "               {'0439139597': 6.72},\n",
       "               {'0439136350': 6.55},\n",
       "               {'0439064864': 6.55},\n",
       "               {'0877017883': 6.19},\n",
       "               {'0618002227': 6.16},\n",
       "               {'0590353403': 6.13},\n",
       "               {'0671027344': 6.07},\n",
       "               {'0385199570': 5.93},\n",
       "               {'0771060548': 5.91},\n",
       "               {'0156528207': 5.78},\n",
       "               {'0618129022': 5.76},\n",
       "               {'0552131059': 5.67},\n",
       "               {'0811801802': 5.65},\n",
       "               {'0670032379': 5.55},\n",
       "               {'0812550706': 5.52},\n",
       "               {'0375756981': 5.51},\n",
       "               {'0670894605': 5.42},\n",
       "               {'0811825558': 5.36},\n",
       "               {'0439139600': 5.32}],\n",
       "              3: [{'8845205118': 7.67},\n",
       "               {'8807813823': 7.2},\n",
       "               {'8845915700': 7.17},\n",
       "               {'8817106259': 6.29},\n",
       "               {'8807701510': 6.2},\n",
       "               {'8807816067': 6.18},\n",
       "               {'881786983X': 6.0},\n",
       "               {'0743222229': 5.86},\n",
       "               {'8807817039': 5.83},\n",
       "               {'8807814684': 5.5},\n",
       "               {'8806161741': 5.4},\n",
       "               {'884541096X': 5.4},\n",
       "               {'8845290077': 5.29},\n",
       "               {'8817106100': 5.25},\n",
       "               {'0451164075': 5.2},\n",
       "               {'8807816059': 5.1},\n",
       "               {'8804342838': 5.09},\n",
       "               {'9770390107900': 5.0},\n",
       "               {'1844262553': 8.0},\n",
       "               {'0439139597': 6.72}],\n",
       "              4: [{'1844262553': 8.0},\n",
       "               {'0439139597': 6.72},\n",
       "               {'0439136350': 6.55},\n",
       "               {'0439064864': 6.55},\n",
       "               {'0877017883': 6.19},\n",
       "               {'0618002227': 6.16},\n",
       "               {'0590353403': 6.13},\n",
       "               {'0671027344': 6.07},\n",
       "               {'0385199570': 5.93},\n",
       "               {'0771060548': 5.91},\n",
       "               {'0156528207': 5.78},\n",
       "               {'0618129022': 5.76},\n",
       "               {'0552131059': 5.67},\n",
       "               {'0811801802': 5.65},\n",
       "               {'0670032379': 5.55},\n",
       "               {'0812550706': 5.52},\n",
       "               {'0375756981': 5.51},\n",
       "               {'0670894605': 5.42},\n",
       "               {'0811825558': 5.36},\n",
       "               {'0439139600': 5.32}],\n",
       "              5: [{'1844262553': 8.0},\n",
       "               {'0439139597': 6.72},\n",
       "               {'0439136350': 6.55},\n",
       "               {'0439064864': 6.55},\n",
       "               {'0877017883': 6.19},\n",
       "               {'0618002227': 6.16},\n",
       "               {'0590353403': 6.13},\n",
       "               {'0671027344': 6.07},\n",
       "               {'0385199570': 5.93},\n",
       "               {'0771060548': 5.91},\n",
       "               {'0156528207': 5.78},\n",
       "               {'0618129022': 5.76},\n",
       "               {'0552131059': 5.67},\n",
       "               {'0811801802': 5.65},\n",
       "               {'0670032379': 5.55},\n",
       "               {'0812550706': 5.52},\n",
       "               {'0375756981': 5.51},\n",
       "               {'0670894605': 5.42},\n",
       "               {'0811825558': 5.36},\n",
       "               {'0439139600': 5.32}]},\n",
       "             'netherlands': {0: [{'1844262553': 8.0},\n",
       "               {'0439139597': 6.72},\n",
       "               {'0439136350': 6.55},\n",
       "               {'0439064864': 6.55},\n",
       "               {'0877017883': 6.19},\n",
       "               {'0618002227': 6.16},\n",
       "               {'0590353403': 6.13},\n",
       "               {'0671027344': 6.07},\n",
       "               {'0385199570': 5.93},\n",
       "               {'0771060548': 5.91},\n",
       "               {'0156528207': 5.78},\n",
       "               {'0618129022': 5.76},\n",
       "               {'0552131059': 5.67},\n",
       "               {'0811801802': 5.65},\n",
       "               {'0670032379': 5.55},\n",
       "               {'0812550706': 5.52},\n",
       "               {'0375756981': 5.51},\n",
       "               {'0670894605': 5.42},\n",
       "               {'0811825558': 5.36},\n",
       "               {'0439139600': 5.32}],\n",
       "              1: [{'1844262553': 8.0},\n",
       "               {'0439139597': 6.72},\n",
       "               {'0439136350': 6.55},\n",
       "               {'0439064864': 6.55},\n",
       "               {'0877017883': 6.19},\n",
       "               {'0618002227': 6.16},\n",
       "               {'0590353403': 6.13},\n",
       "               {'0671027344': 6.07},\n",
       "               {'0385199570': 5.93},\n",
       "               {'0771060548': 5.91},\n",
       "               {'0156528207': 5.78},\n",
       "               {'0618129022': 5.76},\n",
       "               {'0552131059': 5.67},\n",
       "               {'0811801802': 5.65},\n",
       "               {'0670032379': 5.55},\n",
       "               {'0812550706': 5.52},\n",
       "               {'0375756981': 5.51},\n",
       "               {'0670894605': 5.42},\n",
       "               {'0811825558': 5.36},\n",
       "               {'0439139600': 5.32}],\n",
       "              2: [{'1844262553': 8.0},\n",
       "               {'0439139597': 6.72},\n",
       "               {'0439136350': 6.55},\n",
       "               {'0439064864': 6.55},\n",
       "               {'0877017883': 6.19},\n",
       "               {'0618002227': 6.16},\n",
       "               {'0590353403': 6.13},\n",
       "               {'0671027344': 6.07},\n",
       "               {'0385199570': 5.93},\n",
       "               {'0771060548': 5.91},\n",
       "               {'0156528207': 5.78},\n",
       "               {'0618129022': 5.76},\n",
       "               {'0552131059': 5.67},\n",
       "               {'0811801802': 5.65},\n",
       "               {'0670032379': 5.55},\n",
       "               {'0812550706': 5.52},\n",
       "               {'0375756981': 5.51},\n",
       "               {'0670894605': 5.42},\n",
       "               {'0811825558': 5.36},\n",
       "               {'0439139600': 5.32}],\n",
       "              3: [{'1400032717': 7.14},\n",
       "               {'1844262553': 8.0},\n",
       "               {'0439139597': 6.72},\n",
       "               {'0439136350': 6.55},\n",
       "               {'0439064864': 6.55},\n",
       "               {'0877017883': 6.19},\n",
       "               {'0618002227': 6.16},\n",
       "               {'0590353403': 6.13},\n",
       "               {'0671027344': 6.07},\n",
       "               {'0385199570': 5.93},\n",
       "               {'0771060548': 5.91},\n",
       "               {'0156528207': 5.78},\n",
       "               {'0618129022': 5.76},\n",
       "               {'0552131059': 5.67},\n",
       "               {'0811801802': 5.65},\n",
       "               {'0670032379': 5.55},\n",
       "               {'0812550706': 5.52},\n",
       "               {'0375756981': 5.51},\n",
       "               {'0670894605': 5.42},\n",
       "               {'0811825558': 5.36}],\n",
       "              4: [{'1844262553': 8.0},\n",
       "               {'0439139597': 6.72},\n",
       "               {'0439136350': 6.55},\n",
       "               {'0439064864': 6.55},\n",
       "               {'0877017883': 6.19},\n",
       "               {'0618002227': 6.16},\n",
       "               {'0590353403': 6.13},\n",
       "               {'0671027344': 6.07},\n",
       "               {'0385199570': 5.93},\n",
       "               {'0771060548': 5.91},\n",
       "               {'0156528207': 5.78},\n",
       "               {'0618129022': 5.76},\n",
       "               {'0552131059': 5.67},\n",
       "               {'0811801802': 5.65},\n",
       "               {'0670032379': 5.55},\n",
       "               {'0812550706': 5.52},\n",
       "               {'0375756981': 5.51},\n",
       "               {'0670894605': 5.42},\n",
       "               {'0811825558': 5.36},\n",
       "               {'0439139600': 5.32}],\n",
       "              5: [{'1844262553': 8.0},\n",
       "               {'0439139597': 6.72},\n",
       "               {'0439136350': 6.55},\n",
       "               {'0439064864': 6.55},\n",
       "               {'0877017883': 6.19},\n",
       "               {'0618002227': 6.16},\n",
       "               {'0590353403': 6.13},\n",
       "               {'0671027344': 6.07},\n",
       "               {'0385199570': 5.93},\n",
       "               {'0771060548': 5.91},\n",
       "               {'0156528207': 5.78},\n",
       "               {'0618129022': 5.76},\n",
       "               {'0552131059': 5.67},\n",
       "               {'0811801802': 5.65},\n",
       "               {'0670032379': 5.55},\n",
       "               {'0812550706': 5.52},\n",
       "               {'0375756981': 5.51},\n",
       "               {'0670894605': 5.42},\n",
       "               {'0811825558': 5.36},\n",
       "               {'0439139600': 5.32}]},\n",
       "             'new zealand': {0: [{'1844262553': 8.0},\n",
       "               {'0439139597': 6.72},\n",
       "               {'0439136350': 6.55},\n",
       "               {'0439064864': 6.55},\n",
       "               {'0877017883': 6.19},\n",
       "               {'0618002227': 6.16},\n",
       "               {'0590353403': 6.13},\n",
       "               {'0671027344': 6.07},\n",
       "               {'0385199570': 5.93},\n",
       "               {'0771060548': 5.91},\n",
       "               {'0156528207': 5.78},\n",
       "               {'0618129022': 5.76},\n",
       "               {'0552131059': 5.67},\n",
       "               {'0811801802': 5.65},\n",
       "               {'0670032379': 5.55},\n",
       "               {'0812550706': 5.52},\n",
       "               {'0375756981': 5.51},\n",
       "               {'0670894605': 5.42},\n",
       "               {'0811825558': 5.36},\n",
       "               {'0439139600': 5.32}],\n",
       "              1: [{'1844262553': 8.0},\n",
       "               {'0439139597': 6.72},\n",
       "               {'0439136350': 6.55},\n",
       "               {'0439064864': 6.55},\n",
       "               {'0877017883': 6.19},\n",
       "               {'0618002227': 6.16},\n",
       "               {'0590353403': 6.13},\n",
       "               {'0671027344': 6.07},\n",
       "               {'0385199570': 5.93},\n",
       "               {'0771060548': 5.91},\n",
       "               {'0156528207': 5.78},\n",
       "               {'0618129022': 5.76},\n",
       "               {'0552131059': 5.67},\n",
       "               {'0811801802': 5.65},\n",
       "               {'0670032379': 5.55},\n",
       "               {'0812550706': 5.52},\n",
       "               {'0375756981': 5.51},\n",
       "               {'0670894605': 5.42},\n",
       "               {'0811825558': 5.36},\n",
       "               {'0439139600': 5.32}],\n",
       "              2: [{'1844262553': 8.0},\n",
       "               {'0439139597': 6.72},\n",
       "               {'0439136350': 6.55},\n",
       "               {'0439064864': 6.55},\n",
       "               {'0877017883': 6.19},\n",
       "               {'0618002227': 6.16},\n",
       "               {'0590353403': 6.13},\n",
       "               {'0671027344': 6.07},\n",
       "               {'0385199570': 5.93},\n",
       "               {'0771060548': 5.91},\n",
       "               {'0156528207': 5.78},\n",
       "               {'0618129022': 5.76},\n",
       "               {'0552131059': 5.67},\n",
       "               {'0811801802': 5.65},\n",
       "               {'0670032379': 5.55},\n",
       "               {'0812550706': 5.52},\n",
       "               {'0375756981': 5.51},\n",
       "               {'0670894605': 5.42},\n",
       "               {'0811825558': 5.36},\n",
       "               {'0439139600': 5.32}],\n",
       "              3: [{'0156027321': 5.2},\n",
       "               {'1844262553': 8.0},\n",
       "               {'0439139597': 6.72},\n",
       "               {'0439136350': 6.55},\n",
       "               {'0439064864': 6.55},\n",
       "               {'0877017883': 6.19},\n",
       "               {'0618002227': 6.16},\n",
       "               {'0590353403': 6.13},\n",
       "               {'0671027344': 6.07},\n",
       "               {'0385199570': 5.93},\n",
       "               {'0771060548': 5.91},\n",
       "               {'0156528207': 5.78},\n",
       "               {'0618129022': 5.76},\n",
       "               {'0552131059': 5.67},\n",
       "               {'0811801802': 5.65},\n",
       "               {'0670032379': 5.55},\n",
       "               {'0812550706': 5.52},\n",
       "               {'0375756981': 5.51},\n",
       "               {'0670894605': 5.42},\n",
       "               {'0811825558': 5.36}],\n",
       "              4: [{'1844262553': 8.0},\n",
       "               {'0439139597': 6.72},\n",
       "               {'0439136350': 6.55},\n",
       "               {'0439064864': 6.55},\n",
       "               {'0877017883': 6.19},\n",
       "               {'0618002227': 6.16},\n",
       "               {'0590353403': 6.13},\n",
       "               {'0671027344': 6.07},\n",
       "               {'0385199570': 5.93},\n",
       "               {'0771060548': 5.91},\n",
       "               {'0156528207': 5.78},\n",
       "               {'0618129022': 5.76},\n",
       "               {'0552131059': 5.67},\n",
       "               {'0811801802': 5.65},\n",
       "               {'0670032379': 5.55},\n",
       "               {'0812550706': 5.52},\n",
       "               {'0375756981': 5.51},\n",
       "               {'0670894605': 5.42},\n",
       "               {'0811825558': 5.36},\n",
       "               {'0439139600': 5.32}],\n",
       "              5: [{'1844262553': 8.0},\n",
       "               {'0439139597': 6.72},\n",
       "               {'0439136350': 6.55},\n",
       "               {'0439064864': 6.55},\n",
       "               {'0877017883': 6.19},\n",
       "               {'0618002227': 6.16},\n",
       "               {'0590353403': 6.13},\n",
       "               {'0671027344': 6.07},\n",
       "               {'0385199570': 5.93},\n",
       "               {'0771060548': 5.91},\n",
       "               {'0156528207': 5.78},\n",
       "               {'0618129022': 5.76},\n",
       "               {'0552131059': 5.67},\n",
       "               {'0811801802': 5.65},\n",
       "               {'0670032379': 5.55},\n",
       "               {'0812550706': 5.52},\n",
       "               {'0375756981': 5.51},\n",
       "               {'0670894605': 5.42},\n",
       "               {'0811825558': 5.36},\n",
       "               {'0439139600': 5.32}]},\n",
       "             'other': {0: [{'034536676X': 9.8},\n",
       "               {'8826703132': 9.0},\n",
       "               {'074343627X': 8.0},\n",
       "               {'0446604844': 7.8},\n",
       "               {'0439064872': 7.44},\n",
       "               {'0439139600': 7.4},\n",
       "               {'0553296981': 7.4},\n",
       "               {'0380789019': 7.22},\n",
       "               {'1558743669': 7.2},\n",
       "               {'0553375407': 7.2},\n",
       "               {'0140298479': 7.17},\n",
       "               {'0804111359': 7.0},\n",
       "               {'0316693251': 7.0},\n",
       "               {'0060008024': 6.86},\n",
       "               {'1573229571': 6.8},\n",
       "               {'0688177751': 6.8},\n",
       "               {'0385720106': 6.71},\n",
       "               {'0670892963': 6.6},\n",
       "               {'0446608955': 6.5},\n",
       "               {'0671001795': 6.5}],\n",
       "              1: [{'1844262553': 8.0},\n",
       "               {'0439139597': 6.72},\n",
       "               {'0439136350': 6.55},\n",
       "               {'0439064864': 6.55},\n",
       "               {'0877017883': 6.19},\n",
       "               {'0618002227': 6.16},\n",
       "               {'0590353403': 6.13},\n",
       "               {'0671027344': 6.07},\n",
       "               {'0385199570': 5.93},\n",
       "               {'0771060548': 5.91},\n",
       "               {'0156528207': 5.78},\n",
       "               {'0618129022': 5.76},\n",
       "               {'0552131059': 5.67},\n",
       "               {'0811801802': 5.65},\n",
       "               {'0670032379': 5.55},\n",
       "               {'0812550706': 5.52},\n",
       "               {'0375756981': 5.51},\n",
       "               {'0670894605': 5.42},\n",
       "               {'0811825558': 5.36},\n",
       "               {'0439139600': 5.32}],\n",
       "              2: [{'1844262553': 8.0},\n",
       "               {'0439139597': 6.72},\n",
       "               {'0439136350': 6.55},\n",
       "               {'0439064864': 6.55},\n",
       "               {'0877017883': 6.19},\n",
       "               {'0618002227': 6.16},\n",
       "               {'0590353403': 6.13},\n",
       "               {'0671027344': 6.07},\n",
       "               {'0385199570': 5.93},\n",
       "               {'0771060548': 5.91},\n",
       "               {'0156528207': 5.78},\n",
       "               {'0618129022': 5.76},\n",
       "               {'0552131059': 5.67},\n",
       "               {'0811801802': 5.65},\n",
       "               {'0670032379': 5.55},\n",
       "               {'0812550706': 5.52},\n",
       "               {'0375756981': 5.51},\n",
       "               {'0670894605': 5.42},\n",
       "               {'0811825558': 5.36},\n",
       "               {'0439139600': 5.32}],\n",
       "              3: [{'0553296981': 9.38},\n",
       "               {'0441001971': 8.6},\n",
       "               {'0590353403': 8.5},\n",
       "               {'0786868716': 8.2},\n",
       "               {'0446310786': 8.11},\n",
       "               {'0439136350': 7.89},\n",
       "               {'0553213148': 7.6},\n",
       "               {'0439139597': 7.22},\n",
       "               {'0345378490': 7.2},\n",
       "               {'0842329218': 7.14},\n",
       "               {'0312924585': 7.0},\n",
       "               {'051513628X': 6.8},\n",
       "               {'0151008116': 6.8},\n",
       "               {'0061092177': 6.8},\n",
       "               {'0099800403': 6.8},\n",
       "               {'0385484518': 6.67},\n",
       "               {'0747546290': 6.6},\n",
       "               {'0140621725': 6.5},\n",
       "               {'0684872153': 6.4},\n",
       "               {'0446670111': 6.4}],\n",
       "              4: [{'1844262553': 8.0},\n",
       "               {'0439139597': 6.72},\n",
       "               {'0439136350': 6.55},\n",
       "               {'0439064864': 6.55},\n",
       "               {'0877017883': 6.19},\n",
       "               {'0618002227': 6.16},\n",
       "               {'0590353403': 6.13},\n",
       "               {'0671027344': 6.07},\n",
       "               {'0385199570': 5.93},\n",
       "               {'0771060548': 5.91},\n",
       "               {'0156528207': 5.78},\n",
       "               {'0618129022': 5.76},\n",
       "               {'0552131059': 5.67},\n",
       "               {'0811801802': 5.65},\n",
       "               {'0670032379': 5.55},\n",
       "               {'0812550706': 5.52},\n",
       "               {'0375756981': 5.51},\n",
       "               {'0670894605': 5.42},\n",
       "               {'0811825558': 5.36},\n",
       "               {'0439139600': 5.32}],\n",
       "              5: [{'1844262553': 8.0},\n",
       "               {'0439139597': 6.72},\n",
       "               {'0439136350': 6.55},\n",
       "               {'0439064864': 6.55},\n",
       "               {'0877017883': 6.19},\n",
       "               {'0618002227': 6.16},\n",
       "               {'0590353403': 6.13},\n",
       "               {'0671027344': 6.07},\n",
       "               {'0385199570': 5.93},\n",
       "               {'0771060548': 5.91},\n",
       "               {'0156528207': 5.78},\n",
       "               {'0618129022': 5.76},\n",
       "               {'0552131059': 5.67},\n",
       "               {'0811801802': 5.65},\n",
       "               {'0670032379': 5.55},\n",
       "               {'0812550706': 5.52},\n",
       "               {'0375756981': 5.51},\n",
       "               {'0670894605': 5.42},\n",
       "               {'0811825558': 5.36},\n",
       "               {'0439139600': 5.32}]},\n",
       "             'portugal': {0: [{'1844262553': 8.0},\n",
       "               {'0439139597': 6.72},\n",
       "               {'0439136350': 6.55},\n",
       "               {'0439064864': 6.55},\n",
       "               {'0877017883': 6.19},\n",
       "               {'0618002227': 6.16},\n",
       "               {'0590353403': 6.13},\n",
       "               {'0671027344': 6.07},\n",
       "               {'0385199570': 5.93},\n",
       "               {'0771060548': 5.91},\n",
       "               {'0156528207': 5.78},\n",
       "               {'0618129022': 5.76},\n",
       "               {'0552131059': 5.67},\n",
       "               {'0811801802': 5.65},\n",
       "               {'0670032379': 5.55},\n",
       "               {'0812550706': 5.52},\n",
       "               {'0375756981': 5.51},\n",
       "               {'0670894605': 5.42},\n",
       "               {'0811825558': 5.36},\n",
       "               {'0439139600': 5.32}],\n",
       "              1: [{'1844262553': 8.0},\n",
       "               {'0439139597': 6.72},\n",
       "               {'0439136350': 6.55},\n",
       "               {'0439064864': 6.55},\n",
       "               {'0877017883': 6.19},\n",
       "               {'0618002227': 6.16},\n",
       "               {'0590353403': 6.13},\n",
       "               {'0671027344': 6.07},\n",
       "               {'0385199570': 5.93},\n",
       "               {'0771060548': 5.91},\n",
       "               {'0156528207': 5.78},\n",
       "               {'0618129022': 5.76},\n",
       "               {'0552131059': 5.67},\n",
       "               {'0811801802': 5.65},\n",
       "               {'0670032379': 5.55},\n",
       "               {'0812550706': 5.52},\n",
       "               {'0375756981': 5.51},\n",
       "               {'0670894605': 5.42},\n",
       "               {'0811825558': 5.36},\n",
       "               {'0439139600': 5.32}],\n",
       "              2: [{'1844262553': 8.0},\n",
       "               {'0439139597': 6.72},\n",
       "               {'0439136350': 6.55},\n",
       "               {'0439064864': 6.55},\n",
       "               {'0877017883': 6.19},\n",
       "               {'0618002227': 6.16},\n",
       "               {'0590353403': 6.13},\n",
       "               {'0671027344': 6.07},\n",
       "               {'0385199570': 5.93},\n",
       "               {'0771060548': 5.91},\n",
       "               {'0156528207': 5.78},\n",
       "               {'0618129022': 5.76},\n",
       "               {'0552131059': 5.67},\n",
       "               {'0811801802': 5.65},\n",
       "               {'0670032379': 5.55},\n",
       "               {'0812550706': 5.52},\n",
       "               {'0375756981': 5.51},\n",
       "               {'0670894605': 5.42},\n",
       "               {'0811825558': 5.36},\n",
       "               {'0439139600': 5.32}],\n",
       "              3: [{'038082101X': 8.86},\n",
       "               {'0439139600': 7.33},\n",
       "               {'0380815923': 6.6},\n",
       "               {'006050918X': 6.4},\n",
       "               {'9505156944': 6.33},\n",
       "               {'0380977788': 5.86},\n",
       "               {'002542730X': 5.75},\n",
       "               {'0460877305': 5.71},\n",
       "               {'0385721234': 5.5},\n",
       "               {'0385413041': 5.4},\n",
       "               {'9726081378': 5.4},\n",
       "               {'0811214982': 5.3},\n",
       "               {'0330262130': 5.2},\n",
       "               {'0880381744': 5.2},\n",
       "               {'0552137030': 5.2},\n",
       "               {'9722113747': 5.17},\n",
       "               {'9580464162': 5.0},\n",
       "               {'9724614565': 5.0},\n",
       "               {'1401201385': 5.0},\n",
       "               {'1844262553': 8.0}],\n",
       "              4: [{'1844262553': 8.0},\n",
       "               {'0439139597': 6.72},\n",
       "               {'0439136350': 6.55},\n",
       "               {'0439064864': 6.55},\n",
       "               {'0877017883': 6.19},\n",
       "               {'0618002227': 6.16},\n",
       "               {'0590353403': 6.13},\n",
       "               {'0671027344': 6.07},\n",
       "               {'0385199570': 5.93},\n",
       "               {'0771060548': 5.91},\n",
       "               {'0156528207': 5.78},\n",
       "               {'0618129022': 5.76},\n",
       "               {'0552131059': 5.67},\n",
       "               {'0811801802': 5.65},\n",
       "               {'0670032379': 5.55},\n",
       "               {'0812550706': 5.52},\n",
       "               {'0375756981': 5.51},\n",
       "               {'0670894605': 5.42},\n",
       "               {'0811825558': 5.36},\n",
       "               {'0439139600': 5.32}],\n",
       "              5: [{'1844262553': 8.0},\n",
       "               {'0439139597': 6.72},\n",
       "               {'0439136350': 6.55},\n",
       "               {'0439064864': 6.55},\n",
       "               {'0877017883': 6.19},\n",
       "               {'0618002227': 6.16},\n",
       "               {'0590353403': 6.13},\n",
       "               {'0671027344': 6.07},\n",
       "               {'0385199570': 5.93},\n",
       "               {'0771060548': 5.91},\n",
       "               {'0156528207': 5.78},\n",
       "               {'0618129022': 5.76},\n",
       "               {'0552131059': 5.67},\n",
       "               {'0811801802': 5.65},\n",
       "               {'0670032379': 5.55},\n",
       "               {'0812550706': 5.52},\n",
       "               {'0375756981': 5.51},\n",
       "               {'0670894605': 5.42},\n",
       "               {'0811825558': 5.36},\n",
       "               {'0439139600': 5.32}]},\n",
       "             'spain': {0: [{'1844262553': 8.0},\n",
       "               {'0439139597': 6.72},\n",
       "               {'0439136350': 6.55},\n",
       "               {'0439064864': 6.55},\n",
       "               {'0877017883': 6.19},\n",
       "               {'0618002227': 6.16},\n",
       "               {'0590353403': 6.13},\n",
       "               {'0671027344': 6.07},\n",
       "               {'0385199570': 5.93},\n",
       "               {'0771060548': 5.91},\n",
       "               {'0156528207': 5.78},\n",
       "               {'0618129022': 5.76},\n",
       "               {'0552131059': 5.67},\n",
       "               {'0811801802': 5.65},\n",
       "               {'0670032379': 5.55},\n",
       "               {'0812550706': 5.52},\n",
       "               {'0375756981': 5.51},\n",
       "               {'0670894605': 5.42},\n",
       "               {'0811825558': 5.36},\n",
       "               {'0439139600': 5.32}],\n",
       "              1: [{'1844262553': 8.0},\n",
       "               {'0439139597': 6.72},\n",
       "               {'0439136350': 6.55},\n",
       "               {'0439064864': 6.55},\n",
       "               {'0877017883': 6.19},\n",
       "               {'0618002227': 6.16},\n",
       "               {'0590353403': 6.13},\n",
       "               {'0671027344': 6.07},\n",
       "               {'0385199570': 5.93},\n",
       "               {'0771060548': 5.91},\n",
       "               {'0156528207': 5.78},\n",
       "               {'0618129022': 5.76},\n",
       "               {'0552131059': 5.67},\n",
       "               {'0811801802': 5.65},\n",
       "               {'0670032379': 5.55},\n",
       "               {'0812550706': 5.52},\n",
       "               {'0375756981': 5.51},\n",
       "               {'0670894605': 5.42},\n",
       "               {'0811825558': 5.36},\n",
       "               {'0439139600': 5.32}],\n",
       "              2: [{'1844262553': 8.0},\n",
       "               {'0439139597': 6.72},\n",
       "               {'0439136350': 6.55},\n",
       "               {'0439064864': 6.55},\n",
       "               {'0877017883': 6.19},\n",
       "               {'0618002227': 6.16},\n",
       "               {'0590353403': 6.13},\n",
       "               {'0671027344': 6.07},\n",
       "               {'0385199570': 5.93},\n",
       "               {'0771060548': 5.91},\n",
       "               {'0156528207': 5.78},\n",
       "               {'0618129022': 5.76},\n",
       "               {'0552131059': 5.67},\n",
       "               {'0811801802': 5.65},\n",
       "               {'0670032379': 5.55},\n",
       "               {'0812550706': 5.52},\n",
       "               {'0375756981': 5.51},\n",
       "               {'0670894605': 5.42},\n",
       "               {'0811825558': 5.36},\n",
       "               {'0439139600': 5.32}],\n",
       "              3: [{'8445071416': 8.69},\n",
       "               {'8420616893': 8.62},\n",
       "               {'8420613487': 8.6},\n",
       "               {'950491036X': 8.43},\n",
       "               {'8478886508': 8.4},\n",
       "               {'8478886451': 8.4},\n",
       "               {'0156013924': 7.8},\n",
       "               {'8408039369': 7.8},\n",
       "               {'8420636282': 7.6},\n",
       "               {'8495501074': 7.43},\n",
       "               {'8420432113': 7.2},\n",
       "               {'8440627203': 7.17},\n",
       "               {'8445071408': 7.0},\n",
       "               {'0452282152': 7.0},\n",
       "               {'9681501225': 7.0},\n",
       "               {'8445071769': 6.8},\n",
       "               {'8420466034': 6.8},\n",
       "               {'8445071394': 6.8},\n",
       "               {'8423309223': 6.62},\n",
       "               {'8433914545': 6.62}],\n",
       "              4: [{'8408043641': 6},\n",
       "               {'1844262553': 8.0},\n",
       "               {'0439139597': 6.72},\n",
       "               {'0439136350': 6.55},\n",
       "               {'0439064864': 6.55},\n",
       "               {'0877017883': 6.19},\n",
       "               {'0618002227': 6.16},\n",
       "               {'0590353403': 6.13},\n",
       "               {'0671027344': 6.07},\n",
       "               {'0385199570': 5.93},\n",
       "               {'0771060548': 5.91},\n",
       "               {'0156528207': 5.78},\n",
       "               {'0618129022': 5.76},\n",
       "               {'0552131059': 5.67},\n",
       "               {'0811801802': 5.65},\n",
       "               {'0670032379': 5.55},\n",
       "               {'0812550706': 5.52},\n",
       "               {'0375756981': 5.51},\n",
       "               {'0670894605': 5.42},\n",
       "               {'0811825558': 5.36}],\n",
       "              5: [{'1844262553': 8.0},\n",
       "               {'0439139597': 6.72},\n",
       "               {'0439136350': 6.55},\n",
       "               {'0439064864': 6.55},\n",
       "               {'0877017883': 6.19},\n",
       "               {'0618002227': 6.16},\n",
       "               {'0590353403': 6.13},\n",
       "               {'0671027344': 6.07},\n",
       "               {'0385199570': 5.93},\n",
       "               {'0771060548': 5.91},\n",
       "               {'0156528207': 5.78},\n",
       "               {'0618129022': 5.76},\n",
       "               {'0552131059': 5.67},\n",
       "               {'0811801802': 5.65},\n",
       "               {'0670032379': 5.55},\n",
       "               {'0812550706': 5.52},\n",
       "               {'0375756981': 5.51},\n",
       "               {'0670894605': 5.42},\n",
       "               {'0811825558': 5.36},\n",
       "               {'0439139600': 5.32}]},\n",
       "             'switzerland': {0: [{'1844262553': 8.0},\n",
       "               {'0439139597': 6.72},\n",
       "               {'0439136350': 6.55},\n",
       "               {'0439064864': 6.55},\n",
       "               {'0877017883': 6.19},\n",
       "               {'0618002227': 6.16},\n",
       "               {'0590353403': 6.13},\n",
       "               {'0671027344': 6.07},\n",
       "               {'0385199570': 5.93},\n",
       "               {'0771060548': 5.91},\n",
       "               {'0156528207': 5.78},\n",
       "               {'0618129022': 5.76},\n",
       "               {'0552131059': 5.67},\n",
       "               {'0811801802': 5.65},\n",
       "               {'0670032379': 5.55},\n",
       "               {'0812550706': 5.52},\n",
       "               {'0375756981': 5.51},\n",
       "               {'0670894605': 5.42},\n",
       "               {'0811825558': 5.36},\n",
       "               {'0439139600': 5.32}],\n",
       "              2: [{'1844262553': 8.0},\n",
       "               {'0439139597': 6.72},\n",
       "               {'0439136350': 6.55},\n",
       "               {'0439064864': 6.55},\n",
       "               {'0877017883': 6.19},\n",
       "               {'0618002227': 6.16},\n",
       "               {'0590353403': 6.13},\n",
       "               {'0671027344': 6.07},\n",
       "               {'0385199570': 5.93},\n",
       "               {'0771060548': 5.91},\n",
       "               {'0156528207': 5.78},\n",
       "               {'0618129022': 5.76},\n",
       "               {'0552131059': 5.67},\n",
       "               {'0811801802': 5.65},\n",
       "               {'0670032379': 5.55},\n",
       "               {'0812550706': 5.52},\n",
       "               {'0375756981': 5.51},\n",
       "               {'0670894605': 5.42},\n",
       "               {'0811825558': 5.36},\n",
       "               {'0439139600': 5.32}],\n",
       "              3: [{'3426600218': 6.6},\n",
       "               {'1844262553': 8.0},\n",
       "               {'0439139597': 6.72},\n",
       "               {'0439136350': 6.55},\n",
       "               {'0439064864': 6.55},\n",
       "               {'0877017883': 6.19},\n",
       "               {'0618002227': 6.16},\n",
       "               {'0590353403': 6.13},\n",
       "               {'0671027344': 6.07},\n",
       "               {'0385199570': 5.93},\n",
       "               {'0771060548': 5.91},\n",
       "               {'0156528207': 5.78},\n",
       "               {'0618129022': 5.76},\n",
       "               {'0552131059': 5.67},\n",
       "               {'0811801802': 5.65},\n",
       "               {'0670032379': 5.55},\n",
       "               {'0812550706': 5.52},\n",
       "               {'0375756981': 5.51},\n",
       "               {'0670894605': 5.42},\n",
       "               {'0811825558': 5.36}],\n",
       "              4: [{'1844262553': 8.0},\n",
       "               {'0439139597': 6.72},\n",
       "               {'0439136350': 6.55},\n",
       "               {'0439064864': 6.55},\n",
       "               {'0877017883': 6.19},\n",
       "               {'0618002227': 6.16},\n",
       "               {'0590353403': 6.13},\n",
       "               {'0671027344': 6.07},\n",
       "               {'0385199570': 5.93},\n",
       "               {'0771060548': 5.91},\n",
       "               {'0156528207': 5.78},\n",
       "               {'0618129022': 5.76},\n",
       "               {'0552131059': 5.67},\n",
       "               {'0811801802': 5.65},\n",
       "               {'0670032379': 5.55},\n",
       "               {'0812550706': 5.52},\n",
       "               {'0375756981': 5.51},\n",
       "               {'0670894605': 5.42},\n",
       "               {'0811825558': 5.36},\n",
       "               {'0439139600': 5.32}]},\n",
       "             'united kingdom': {0: [{'0590660543': 6.33},\n",
       "               {'000649840X': 6.17},\n",
       "               {'0330367358': 6.0},\n",
       "               {'0330376519': 6.0},\n",
       "               {'1857027051': 6.0},\n",
       "               {'0749395990': 5.67},\n",
       "               {'0552124753': 5.6},\n",
       "               {'0099771519': 5.33},\n",
       "               {'0749399902': 5.0},\n",
       "               {'1844262553': 8.0},\n",
       "               {'0439139597': 6.72},\n",
       "               {'0439136350': 6.55},\n",
       "               {'0439064864': 6.55},\n",
       "               {'0877017883': 6.19},\n",
       "               {'0618002227': 6.16},\n",
       "               {'0590353403': 6.13},\n",
       "               {'0671027344': 6.07},\n",
       "               {'0385199570': 5.93},\n",
       "               {'0771060548': 5.91},\n",
       "               {'0156528207': 5.78}],\n",
       "              1: [{'1844262553': 8.0},\n",
       "               {'0439139597': 6.72},\n",
       "               {'0439136350': 6.55},\n",
       "               {'0439064864': 6.55},\n",
       "               {'0877017883': 6.19},\n",
       "               {'0618002227': 6.16},\n",
       "               {'0590353403': 6.13},\n",
       "               {'0671027344': 6.07},\n",
       "               {'0385199570': 5.93},\n",
       "               {'0771060548': 5.91},\n",
       "               {'0156528207': 5.78},\n",
       "               {'0618129022': 5.76},\n",
       "               {'0552131059': 5.67},\n",
       "               {'0811801802': 5.65},\n",
       "               {'0670032379': 5.55},\n",
       "               {'0812550706': 5.52},\n",
       "               {'0375756981': 5.51},\n",
       "               {'0670894605': 5.42},\n",
       "               {'0811825558': 5.36},\n",
       "               {'0439139600': 5.32}],\n",
       "              2: [{'1844262553': 8.0},\n",
       "               {'0439139597': 6.72},\n",
       "               {'0439136350': 6.55},\n",
       "               {'0439064864': 6.55},\n",
       "               {'0877017883': 6.19},\n",
       "               {'0618002227': 6.16},\n",
       "               {'0590353403': 6.13},\n",
       "               {'0671027344': 6.07},\n",
       "               {'0385199570': 5.93},\n",
       "               {'0771060548': 5.91},\n",
       "               {'0156528207': 5.78},\n",
       "               {'0618129022': 5.76},\n",
       "               {'0552131059': 5.67},\n",
       "               {'0811801802': 5.65},\n",
       "               {'0670032379': 5.55},\n",
       "               {'0812550706': 5.52},\n",
       "               {'0375756981': 5.51},\n",
       "               {'0670894605': 5.42},\n",
       "               {'0811825558': 5.36},\n",
       "               {'0439139600': 5.32}],\n",
       "              3: [{'1844262553': 8.35},\n",
       "               {'0091891965': 8.2},\n",
       "               {'0140620117': 7.17},\n",
       "               {'0330258648': 7.0},\n",
       "               {'1860465811': 7.0},\n",
       "               {'1857231384': 7.0},\n",
       "               {'0552145424': 6.83},\n",
       "               {'0440206154': 6.67},\n",
       "               {'0552131059': 6.62},\n",
       "               {'0192833596': 6.6},\n",
       "               {'0440235596': 6.6},\n",
       "               {'0552142379': 6.5},\n",
       "               {'0330267388': 6.4},\n",
       "               {'0671024337': 6.4},\n",
       "               {'0380002930': 6.4},\n",
       "               {'0722532938': 6.38},\n",
       "               {'0552149519': 6.2},\n",
       "               {'0140287248': 6.17},\n",
       "               {'0380813815': 6.17},\n",
       "               {'0064407667': 6.12}],\n",
       "              4: [{'1844262553': 8.5},\n",
       "               {'0552147680': 6.6},\n",
       "               {'0552131067': 5.8},\n",
       "               {'0552996181': 5.0},\n",
       "               {'1844262553': 8.0},\n",
       "               {'0439139597': 6.72},\n",
       "               {'0439136350': 6.55},\n",
       "               {'0439064864': 6.55},\n",
       "               {'0877017883': 6.19},\n",
       "               {'0618002227': 6.16},\n",
       "               {'0590353403': 6.13},\n",
       "               {'0671027344': 6.07},\n",
       "               {'0385199570': 5.93},\n",
       "               {'0771060548': 5.91},\n",
       "               {'0156528207': 5.78},\n",
       "               {'0618129022': 5.76},\n",
       "               {'0552131059': 5.67},\n",
       "               {'0811801802': 5.65},\n",
       "               {'0670032379': 5.55},\n",
       "               {'0812550706': 5.52}],\n",
       "              5: [{'1844262553': 8.0},\n",
       "               {'0439139597': 6.72},\n",
       "               {'0439136350': 6.55},\n",
       "               {'0439064864': 6.55},\n",
       "               {'0877017883': 6.19},\n",
       "               {'0618002227': 6.16},\n",
       "               {'0590353403': 6.13},\n",
       "               {'0671027344': 6.07},\n",
       "               {'0385199570': 5.93},\n",
       "               {'0771060548': 5.91},\n",
       "               {'0156528207': 5.78},\n",
       "               {'0618129022': 5.76},\n",
       "               {'0552131059': 5.67},\n",
       "               {'0811801802': 5.65},\n",
       "               {'0670032379': 5.55},\n",
       "               {'0812550706': 5.52},\n",
       "               {'0375756981': 5.51},\n",
       "               {'0670894605': 5.42},\n",
       "               {'0811825558': 5.36},\n",
       "               {'0439139600': 5.32}]},\n",
       "             'usa': {0: [{'0156004801': 9.6},\n",
       "               {'0060256672': 9.33},\n",
       "               {'0971942315': 9.0},\n",
       "               {'1576738167': 9.0},\n",
       "               {'0553351397': 8.83},\n",
       "               {'0441002935': 8.6},\n",
       "               {'0615116426': 8.45},\n",
       "               {'0316735027': 8.33},\n",
       "               {'0140309578': 8.33},\n",
       "               {'0140185232': 8.2},\n",
       "               {'0553148001': 8.17},\n",
       "               {'0395977894': 8.1},\n",
       "               {'0743455967': 8.0},\n",
       "               {'0618002235': 8.0},\n",
       "               {'039480029X': 8.0},\n",
       "               {'0877738513': 8.0},\n",
       "               {'0060248025': 8.0},\n",
       "               {'0807083054': 7.89},\n",
       "               {'0553380958': 7.8},\n",
       "               {'0553213504': 7.8}],\n",
       "              1: [{'0064407667': 9.6},\n",
       "               {'0439064872': 8.0},\n",
       "               {'059035342X': 7.33},\n",
       "               {'1844262553': 8.0},\n",
       "               {'0439139597': 6.72},\n",
       "               {'0439136350': 6.55},\n",
       "               {'0439064864': 6.55},\n",
       "               {'0877017883': 6.19},\n",
       "               {'0618002227': 6.16},\n",
       "               {'0590353403': 6.13},\n",
       "               {'0671027344': 6.07},\n",
       "               {'0385199570': 5.93},\n",
       "               {'0771060548': 5.91},\n",
       "               {'0156528207': 5.78},\n",
       "               {'0618129022': 5.76},\n",
       "               {'0552131059': 5.67},\n",
       "               {'0811801802': 5.65},\n",
       "               {'0670032379': 5.55},\n",
       "               {'0812550706': 5.52},\n",
       "               {'0375756981': 5.51}],\n",
       "              2: [{'0590353403': 9.44},\n",
       "               {'0440237688': 9.4},\n",
       "               {'0451191137': 8.8},\n",
       "               {'0439139597': 8.36},\n",
       "               {'0679886370': 8.17},\n",
       "               {'0140348107': 8.0},\n",
       "               {'0064472272': 7.71},\n",
       "               {'0439064864': 7.67},\n",
       "               {'0671027344': 7.64},\n",
       "               {'0446608955': 7.56},\n",
       "               {'0394820371': 7.43},\n",
       "               {'0385729332': 7.33},\n",
       "               {'0316666343': 7.29},\n",
       "               {'0385729340': 7.2},\n",
       "               {'0385730586': 7.0},\n",
       "               {'043935806X': 6.62},\n",
       "               {'0439136350': 6.6},\n",
       "               {'1576738159': 6.6},\n",
       "               {'0440439884': 6.4},\n",
       "               {'0345342968': 6.33}],\n",
       "              3: [{'0066238501': 9.88},\n",
       "               {'0517693119': 9.83},\n",
       "               {'0394800389': 9.83},\n",
       "               {'0920668364': 9.67},\n",
       "               {'0395177111': 9.5},\n",
       "               {'0890876789': 9.4},\n",
       "               {'0898159954': 9.4},\n",
       "               {'0316286850': 9.4},\n",
       "               {'0375503803': 9.2},\n",
       "               {'0316779059': 9.0},\n",
       "               {'156402976X': 9.0},\n",
       "               {'0553110845': 9.0},\n",
       "               {'0060256737': 8.83},\n",
       "               {'0060968966': 8.8},\n",
       "               {'0670451932': 8.8},\n",
       "               {'0805013407': 8.6},\n",
       "               {'0060961325': 8.6},\n",
       "               {'0140195831': 8.6},\n",
       "               {'0451525663': 8.6},\n",
       "               {'0451171926': 8.4}],\n",
       "              4: [{'0312303467': 9.4},\n",
       "               {'0060514957': 9.0},\n",
       "               {'0553377868': 8.86},\n",
       "               {'0688167888': 8.4},\n",
       "               {'0399151451': 8.0},\n",
       "               {'1579546463': 8.0},\n",
       "               {'0380977311': 7.86},\n",
       "               {'0553379615': 7.83},\n",
       "               {'0943233828': 7.8},\n",
       "               {'0446532452': 7.57},\n",
       "               {'0553565079': 7.4},\n",
       "               {'0066214769': 7.4},\n",
       "               {'0446322180': 7.29},\n",
       "               {'0439064864': 7.22},\n",
       "               {'0399151613': 7.2},\n",
       "               {'0449911519': 7.2},\n",
       "               {'0451169514': 7.17},\n",
       "               {'0553802461': 7.12},\n",
       "               {'0312983220': 7.0},\n",
       "               {'0312983301': 7.0}],\n",
       "              5: [{'0440234743': 7.6},\n",
       "               {'044022165X': 6.4},\n",
       "               {'1844262553': 8.0},\n",
       "               {'0439139597': 6.72},\n",
       "               {'0439136350': 6.55},\n",
       "               {'0439064864': 6.55},\n",
       "               {'0877017883': 6.19},\n",
       "               {'0618002227': 6.16},\n",
       "               {'0590353403': 6.13},\n",
       "               {'0671027344': 6.07},\n",
       "               {'0385199570': 5.93},\n",
       "               {'0771060548': 5.91},\n",
       "               {'0156528207': 5.78},\n",
       "               {'0618129022': 5.76},\n",
       "               {'0552131059': 5.67},\n",
       "               {'0811801802': 5.65},\n",
       "               {'0670032379': 5.55},\n",
       "               {'0812550706': 5.52},\n",
       "               {'0375756981': 5.51},\n",
       "               {'0670894605': 5.42}]}})"
      ]
     },
     "execution_count": 64,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "feature_recommand_with_rating"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 将推荐表存入本地文件"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "metadata": {},
   "outputs": [],
   "source": [
    "cPickle.dump(feature_recommand,open('./data/feature_recommand.pkl','wb'))\n",
    "cPickle.dump(feature_recommand_with_rating,open('./data/feature_recommand_with_rating.pkl','wb'))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 在验证集上计算推荐的准确率和召回率"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 导入测试集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "      <th>item_id</th>\n",
       "      <th>rating</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>109814</th>\n",
       "      <td>27462</td>\n",
       "      <td>usa</td>\n",
       "      <td>0</td>\n",
       "      <td>1587492695</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>561359</th>\n",
       "      <td>137190</td>\n",
       "      <td>france</td>\n",
       "      <td>3</td>\n",
       "      <td>0552997234</td>\n",
       "      <td>8</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>182843</th>\n",
       "      <td>42721</td>\n",
       "      <td>canada</td>\n",
       "      <td>3</td>\n",
       "      <td>0671024108</td>\n",
       "      <td>8</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>854047</th>\n",
       "      <td>208829</td>\n",
       "      <td>canada</td>\n",
       "      <td>0</td>\n",
       "      <td>0140503897</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>559003</th>\n",
       "      <td>136348</td>\n",
       "      <td>usa</td>\n",
       "      <td>4</td>\n",
       "      <td>0807220299</td>\n",
       "      <td>9</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "        user_id location  age     item_id  rating\n",
       "109814    27462      usa    0  1587492695       0\n",
       "561359   137190   france    3  0552997234       8\n",
       "182843    42721   canada    3  0671024108       8\n",
       "854047   208829   canada    0  0140503897       0\n",
       "559003   136348      usa    4  0807220299       9"
      ]
     },
     "execution_count": 66,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_data_test = cPickle.load(open('./data/df_data_test.pkl','rb'))\n",
    "df_data_test.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 读取推荐列表"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "defaultdict(dict,\n",
       "            {'australia': {0: ['0099771519',\n",
       "               '1857022424',\n",
       "               '1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0375756981',\n",
       "               '0670894605'],\n",
       "              1: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0375756981',\n",
       "               '0670894605',\n",
       "               '0811825558',\n",
       "               '0439139600'],\n",
       "              2: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0375756981',\n",
       "               '0670894605',\n",
       "               '0811825558',\n",
       "               '0439139600'],\n",
       "              3: ['0552998486',\n",
       "               '015602943X',\n",
       "               '0552140295',\n",
       "               '0440220602',\n",
       "               '0446532231',\n",
       "               '0007170866',\n",
       "               '1875989218',\n",
       "               '0099727412',\n",
       "               '0860074382',\n",
       "               '0140008535',\n",
       "               '0385335482',\n",
       "               '0553279556',\n",
       "               '1400034779',\n",
       "               '0743225082',\n",
       "               '0949206318',\n",
       "               '1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883'],\n",
       "              4: ['0091867770',\n",
       "               '1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0375756981',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              5: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0375756981',\n",
       "               '0670894605',\n",
       "               '0811825558',\n",
       "               '0439139600']},\n",
       "             'canada': {0: ['0140505865',\n",
       "               '0140067477',\n",
       "               '076790592X',\n",
       "               '0553250426',\n",
       "               '0060392452',\n",
       "               '0676974791',\n",
       "               '080410526X',\n",
       "               '1552783081',\n",
       "               '0446350982',\n",
       "               '038079487X',\n",
       "               '0385505833',\n",
       "               '0676972152',\n",
       "               '0786867647',\n",
       "               '0060959037',\n",
       "               '0771099894',\n",
       "               '0812550706',\n",
       "               '0425122123',\n",
       "               '0446667900',\n",
       "               '0671011375',\n",
       "               '1550541129'],\n",
       "              1: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0375756981',\n",
       "               '0670894605',\n",
       "               '0811825558',\n",
       "               '0439139600'],\n",
       "              2: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0375756981',\n",
       "               '0670894605',\n",
       "               '0811825558',\n",
       "               '0439139600'],\n",
       "              3: ['0060915544',\n",
       "               '0140042393',\n",
       "               '0552137030',\n",
       "               '0836220889',\n",
       "               '0425105334',\n",
       "               '0836218256',\n",
       "               '0140277439',\n",
       "               '0345338588',\n",
       "               '1853260002',\n",
       "               '0060935464',\n",
       "               '0836218353',\n",
       "               '0671868691',\n",
       "               '0446532231',\n",
       "               '038542017X',\n",
       "               '0440224764',\n",
       "               '0770422578',\n",
       "               '0006485278',\n",
       "               '0451163524',\n",
       "               '0771060548',\n",
       "               '0553287893'],\n",
       "              4: ['0380718839',\n",
       "               '0316666343',\n",
       "               '0345370775',\n",
       "               '0684872153',\n",
       "               '0671758896',\n",
       "               '0676974805',\n",
       "               '0440213525',\n",
       "               '0515111279',\n",
       "               '034540288X',\n",
       "               '0676973094',\n",
       "               '0671027360',\n",
       "               '0684874350',\n",
       "               '1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344'],\n",
       "              5: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0375756981',\n",
       "               '0670894605',\n",
       "               '0811825558',\n",
       "               '0439139600']},\n",
       "             'france': {0: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0375756981',\n",
       "               '0670894605',\n",
       "               '0811825558',\n",
       "               '0439139600'],\n",
       "              1: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0375756981',\n",
       "               '0670894605',\n",
       "               '0811825558',\n",
       "               '0439139600'],\n",
       "              2: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0375756981',\n",
       "               '0670894605',\n",
       "               '0811825558',\n",
       "               '0439139600'],\n",
       "              3: ['2070370003',\n",
       "               '2070408507',\n",
       "               '2253140872',\n",
       "               '2266084372',\n",
       "               '2877302202',\n",
       "               '22530152730',\n",
       "               '2070744833',\n",
       "               '2253072079',\n",
       "               '2277260029',\n",
       "               '2290302155',\n",
       "               '2070363317',\n",
       "               '2253153265',\n",
       "               '2253144452',\n",
       "               '2264016124',\n",
       "               '2226135022',\n",
       "               '2020306492',\n",
       "               '2253154393',\n",
       "               '2290308285',\n",
       "               '2253150711',\n",
       "               '229030039X'],\n",
       "              4: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0375756981',\n",
       "               '0670894605',\n",
       "               '0811825558',\n",
       "               '0439139600'],\n",
       "              5: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0375756981',\n",
       "               '0670894605',\n",
       "               '0811825558',\n",
       "               '0439139600']},\n",
       "             'germany': {0: ['3518366823',\n",
       "               '3423072571',\n",
       "               '3518368540',\n",
       "               '3423203668',\n",
       "               '3426029553',\n",
       "               '3453007867',\n",
       "               '3404148665',\n",
       "               '1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552131059'],\n",
       "              1: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0375756981',\n",
       "               '0670894605',\n",
       "               '0811825558',\n",
       "               '0439139600'],\n",
       "              2: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0375756981',\n",
       "               '0670894605',\n",
       "               '0811825558',\n",
       "               '0439139600'],\n",
       "              3: ['3551551936',\n",
       "               '3551551693',\n",
       "               '3551551677',\n",
       "               '3423071516',\n",
       "               '3518372742',\n",
       "               '3257230478',\n",
       "               '3442727952',\n",
       "               '3442724686',\n",
       "               '3518100734',\n",
       "               '3596215226',\n",
       "               '3150000017',\n",
       "               '3426612704',\n",
       "               '3423205202',\n",
       "               '3499224615',\n",
       "               '3423202947',\n",
       "               '3442442354',\n",
       "               '3453071174',\n",
       "               '3551551685',\n",
       "               '3423204206',\n",
       "               '3518388762'],\n",
       "              4: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0375756981',\n",
       "               '0670894605',\n",
       "               '0811825558',\n",
       "               '0439139600'],\n",
       "              5: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0375756981',\n",
       "               '0670894605',\n",
       "               '0811825558',\n",
       "               '0439139600']},\n",
       "             'italy': {0: ['8806142100',\n",
       "               '8826703132',\n",
       "               '884590184X',\n",
       "               '8817131628',\n",
       "               '1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706'],\n",
       "              2: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0375756981',\n",
       "               '0670894605',\n",
       "               '0811825558',\n",
       "               '0439139600'],\n",
       "              3: ['8845205118',\n",
       "               '8807813823',\n",
       "               '8845915700',\n",
       "               '8817106259',\n",
       "               '8807701510',\n",
       "               '8807816067',\n",
       "               '881786983X',\n",
       "               '0743222229',\n",
       "               '8807817039',\n",
       "               '8807814684',\n",
       "               '8806161741',\n",
       "               '884541096X',\n",
       "               '8845290077',\n",
       "               '8817106100',\n",
       "               '0451164075',\n",
       "               '8807816059',\n",
       "               '8804342838',\n",
       "               '9770390107900',\n",
       "               '1844262553',\n",
       "               '0439139597'],\n",
       "              4: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0375756981',\n",
       "               '0670894605',\n",
       "               '0811825558',\n",
       "               '0439139600'],\n",
       "              5: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0375756981',\n",
       "               '0670894605',\n",
       "               '0811825558',\n",
       "               '0439139600']},\n",
       "             'netherlands': {0: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0375756981',\n",
       "               '0670894605',\n",
       "               '0811825558',\n",
       "               '0439139600'],\n",
       "              1: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0375756981',\n",
       "               '0670894605',\n",
       "               '0811825558',\n",
       "               '0439139600'],\n",
       "              2: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0375756981',\n",
       "               '0670894605',\n",
       "               '0811825558',\n",
       "               '0439139600'],\n",
       "              3: ['1400032717',\n",
       "               '1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0375756981',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              4: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0375756981',\n",
       "               '0670894605',\n",
       "               '0811825558',\n",
       "               '0439139600'],\n",
       "              5: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0375756981',\n",
       "               '0670894605',\n",
       "               '0811825558',\n",
       "               '0439139600']},\n",
       "             'new zealand': {0: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0375756981',\n",
       "               '0670894605',\n",
       "               '0811825558',\n",
       "               '0439139600'],\n",
       "              1: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0375756981',\n",
       "               '0670894605',\n",
       "               '0811825558',\n",
       "               '0439139600'],\n",
       "              2: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0375756981',\n",
       "               '0670894605',\n",
       "               '0811825558',\n",
       "               '0439139600'],\n",
       "              3: ['0156027321',\n",
       "               '1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0375756981',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              4: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0375756981',\n",
       "               '0670894605',\n",
       "               '0811825558',\n",
       "               '0439139600'],\n",
       "              5: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0375756981',\n",
       "               '0670894605',\n",
       "               '0811825558',\n",
       "               '0439139600']},\n",
       "             'other': {0: ['034536676X',\n",
       "               '8826703132',\n",
       "               '074343627X',\n",
       "               '0446604844',\n",
       "               '0439064872',\n",
       "               '0439139600',\n",
       "               '0553296981',\n",
       "               '0380789019',\n",
       "               '1558743669',\n",
       "               '0553375407',\n",
       "               '0140298479',\n",
       "               '0804111359',\n",
       "               '0316693251',\n",
       "               '0060008024',\n",
       "               '1573229571',\n",
       "               '0688177751',\n",
       "               '0385720106',\n",
       "               '0670892963',\n",
       "               '0446608955',\n",
       "               '0671001795'],\n",
       "              1: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0375756981',\n",
       "               '0670894605',\n",
       "               '0811825558',\n",
       "               '0439139600'],\n",
       "              2: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0375756981',\n",
       "               '0670894605',\n",
       "               '0811825558',\n",
       "               '0439139600'],\n",
       "              3: ['0553296981',\n",
       "               '0441001971',\n",
       "               '0590353403',\n",
       "               '0786868716',\n",
       "               '0446310786',\n",
       "               '0439136350',\n",
       "               '0553213148',\n",
       "               '0439139597',\n",
       "               '0345378490',\n",
       "               '0842329218',\n",
       "               '0312924585',\n",
       "               '051513628X',\n",
       "               '0151008116',\n",
       "               '0061092177',\n",
       "               '0099800403',\n",
       "               '0385484518',\n",
       "               '0747546290',\n",
       "               '0140621725',\n",
       "               '0684872153',\n",
       "               '0446670111'],\n",
       "              4: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0375756981',\n",
       "               '0670894605',\n",
       "               '0811825558',\n",
       "               '0439139600'],\n",
       "              5: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0375756981',\n",
       "               '0670894605',\n",
       "               '0811825558',\n",
       "               '0439139600']},\n",
       "             'portugal': {0: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0375756981',\n",
       "               '0670894605',\n",
       "               '0811825558',\n",
       "               '0439139600'],\n",
       "              1: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0375756981',\n",
       "               '0670894605',\n",
       "               '0811825558',\n",
       "               '0439139600'],\n",
       "              2: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0375756981',\n",
       "               '0670894605',\n",
       "               '0811825558',\n",
       "               '0439139600'],\n",
       "              3: ['038082101X',\n",
       "               '0439139600',\n",
       "               '0380815923',\n",
       "               '006050918X',\n",
       "               '9505156944',\n",
       "               '0380977788',\n",
       "               '002542730X',\n",
       "               '0460877305',\n",
       "               '0385721234',\n",
       "               '0385413041',\n",
       "               '9726081378',\n",
       "               '0811214982',\n",
       "               '0330262130',\n",
       "               '0880381744',\n",
       "               '0552137030',\n",
       "               '9722113747',\n",
       "               '9580464162',\n",
       "               '9724614565',\n",
       "               '1401201385',\n",
       "               '1844262553'],\n",
       "              4: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0375756981',\n",
       "               '0670894605',\n",
       "               '0811825558',\n",
       "               '0439139600'],\n",
       "              5: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0375756981',\n",
       "               '0670894605',\n",
       "               '0811825558',\n",
       "               '0439139600']},\n",
       "             'spain': {0: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0375756981',\n",
       "               '0670894605',\n",
       "               '0811825558',\n",
       "               '0439139600'],\n",
       "              1: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0375756981',\n",
       "               '0670894605',\n",
       "               '0811825558',\n",
       "               '0439139600'],\n",
       "              2: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0375756981',\n",
       "               '0670894605',\n",
       "               '0811825558',\n",
       "               '0439139600'],\n",
       "              3: ['8445071416',\n",
       "               '8420616893',\n",
       "               '8420613487',\n",
       "               '950491036X',\n",
       "               '8478886508',\n",
       "               '8478886451',\n",
       "               '0156013924',\n",
       "               '8408039369',\n",
       "               '8420636282',\n",
       "               '8495501074',\n",
       "               '8420432113',\n",
       "               '8440627203',\n",
       "               '8445071408',\n",
       "               '0452282152',\n",
       "               '9681501225',\n",
       "               '8445071769',\n",
       "               '8420466034',\n",
       "               '8445071394',\n",
       "               '8423309223',\n",
       "               '8433914545'],\n",
       "              4: ['8408043641',\n",
       "               '1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0375756981',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              5: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0375756981',\n",
       "               '0670894605',\n",
       "               '0811825558',\n",
       "               '0439139600']},\n",
       "             'switzerland': {0: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0375756981',\n",
       "               '0670894605',\n",
       "               '0811825558',\n",
       "               '0439139600'],\n",
       "              2: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0375756981',\n",
       "               '0670894605',\n",
       "               '0811825558',\n",
       "               '0439139600'],\n",
       "              3: ['3426600218',\n",
       "               '1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0375756981',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              4: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0375756981',\n",
       "               '0670894605',\n",
       "               '0811825558',\n",
       "               '0439139600']},\n",
       "             'united kingdom': {0: ['0590660543',\n",
       "               '000649840X',\n",
       "               '0330367358',\n",
       "               '0330376519',\n",
       "               '1857027051',\n",
       "               '0749395990',\n",
       "               '0552124753',\n",
       "               '0099771519',\n",
       "               '0749399902',\n",
       "               '1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207'],\n",
       "              1: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0375756981',\n",
       "               '0670894605',\n",
       "               '0811825558',\n",
       "               '0439139600'],\n",
       "              2: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0375756981',\n",
       "               '0670894605',\n",
       "               '0811825558',\n",
       "               '0439139600'],\n",
       "              3: ['1844262553',\n",
       "               '0091891965',\n",
       "               '0140620117',\n",
       "               '0330258648',\n",
       "               '1860465811',\n",
       "               '1857231384',\n",
       "               '0552145424',\n",
       "               '0440206154',\n",
       "               '0552131059',\n",
       "               '0192833596',\n",
       "               '0440235596',\n",
       "               '0552142379',\n",
       "               '0330267388',\n",
       "               '0671024337',\n",
       "               '0380002930',\n",
       "               '0722532938',\n",
       "               '0552149519',\n",
       "               '0140287248',\n",
       "               '0380813815',\n",
       "               '0064407667'],\n",
       "              4: ['1844262553',\n",
       "               '0552147680',\n",
       "               '0552131067',\n",
       "               '0552996181',\n",
       "               '1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706'],\n",
       "              5: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0375756981',\n",
       "               '0670894605',\n",
       "               '0811825558',\n",
       "               '0439139600']},\n",
       "             'usa': {0: ['0156004801',\n",
       "               '0060256672',\n",
       "               '0971942315',\n",
       "               '1576738167',\n",
       "               '0553351397',\n",
       "               '0441002935',\n",
       "               '0615116426',\n",
       "               '0316735027',\n",
       "               '0140309578',\n",
       "               '0140185232',\n",
       "               '0553148001',\n",
       "               '0395977894',\n",
       "               '0743455967',\n",
       "               '0618002235',\n",
       "               '039480029X',\n",
       "               '0877738513',\n",
       "               '0060248025',\n",
       "               '0807083054',\n",
       "               '0553380958',\n",
       "               '0553213504'],\n",
       "              1: ['0064407667',\n",
       "               '0439064872',\n",
       "               '059035342X',\n",
       "               '1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0375756981'],\n",
       "              2: ['0590353403',\n",
       "               '0440237688',\n",
       "               '0451191137',\n",
       "               '0439139597',\n",
       "               '0679886370',\n",
       "               '0140348107',\n",
       "               '0064472272',\n",
       "               '0439064864',\n",
       "               '0671027344',\n",
       "               '0446608955',\n",
       "               '0394820371',\n",
       "               '0385729332',\n",
       "               '0316666343',\n",
       "               '0385729340',\n",
       "               '0385730586',\n",
       "               '043935806X',\n",
       "               '0439136350',\n",
       "               '1576738159',\n",
       "               '0440439884',\n",
       "               '0345342968'],\n",
       "              3: ['0066238501',\n",
       "               '0517693119',\n",
       "               '0394800389',\n",
       "               '0920668364',\n",
       "               '0395177111',\n",
       "               '0890876789',\n",
       "               '0898159954',\n",
       "               '0316286850',\n",
       "               '0375503803',\n",
       "               '0316779059',\n",
       "               '156402976X',\n",
       "               '0553110845',\n",
       "               '0060256737',\n",
       "               '0060968966',\n",
       "               '0670451932',\n",
       "               '0805013407',\n",
       "               '0060961325',\n",
       "               '0140195831',\n",
       "               '0451525663',\n",
       "               '0451171926'],\n",
       "              4: ['0312303467',\n",
       "               '0060514957',\n",
       "               '0553377868',\n",
       "               '0688167888',\n",
       "               '0399151451',\n",
       "               '1579546463',\n",
       "               '0380977311',\n",
       "               '0553379615',\n",
       "               '0943233828',\n",
       "               '0446532452',\n",
       "               '0553565079',\n",
       "               '0066214769',\n",
       "               '0446322180',\n",
       "               '0439064864',\n",
       "               '0399151613',\n",
       "               '0449911519',\n",
       "               '0451169514',\n",
       "               '0553802461',\n",
       "               '0312983220',\n",
       "               '0312983301'],\n",
       "              5: ['0440234743',\n",
       "               '044022165X',\n",
       "               '1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0375756981',\n",
       "               '0670894605']}})"
      ]
     },
     "execution_count": 68,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "feature_recommand = cPickle.load(open('./data/feature_recommand.pkl','rb'))\n",
    "feature_recommand"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 计算准确率和召回率"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "准确率: 0.00037323860450024475\n",
      "召回率: 0.003196838503429774\n"
     ]
    }
   ],
   "source": [
    "union_quantity = 0\n",
    "recommand_quantity = 0\n",
    "user_fav_quantity = 0\n",
    "\n",
    "for location, groupby_location in df_data_test.groupby('location'):\n",
    "    for age, groupby_location_age in groupby_location.groupby('age'):\n",
    "        for user_id, group_by_location_age_userid in groupby_location_age.groupby('user_id'):\n",
    "            items_rating = group_by_location_age_userid.groupby('item_id')['rating'].mean()\n",
    "            user_fav_items = [\n",
    "                item_id\n",
    "                for item_id in items_rating.index if items_rating[item_id] >= 5\n",
    "            ]\n",
    "            \n",
    "            recommand_items = feature_recommand[location][age]\n",
    "            union_quantity += len(set(recommand_items) & set(user_fav_items))\n",
    "            user_fav_quantity += len(set(user_fav_items))\n",
    "            recommand_quantity += len(set(recommand_items))\n",
    "            \n",
    "print('准确率:',union_quantity / recommand_quantity)\n",
    "print('召回率:',union_quantity / user_fav_quantity)   "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
